usr/src/uts/common/io/ib/ibnex/ibnex_ioctl.c
author Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
Wed, 14 Apr 2010 10:26:18 -0700
changeset 12163 f0cf0084e756
parent 10183 01ff23b04f4f
permissions -rw-r--r--
PSARC 2010/085 IPoIB Administration Enhancement 6837574 IPoIB Administration Enhancement - PSARC 2010/085 6864899 IB datalink names need to be consistent between cluster controllers 6855737 cfgadm status for ibd attachment points gets to inconsistent state 6883212 ibd: add Brussels framework support 6927048 IBD driver should be hardened to handle late HCA port initialization issue 6827237 Fix warlock errors in ibnex
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
4411
d3fb57af2eda 6565553 devfs_clean() should not be used to test for offlinability
vikram
parents: 1093
diff changeset
     5
 * Common Development and Distribution License (the "License").
d3fb57af2eda 6565553 devfs_clean() should not be used to test for offlinability
vikram
parents: 1093
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
12163
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
    22
 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
 * This file contains support required for IB cfgadm plugin.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <sys/conf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <sys/modctl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <sys/ib/mgt/ibdm/ibdm_impl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/ib/ibnex/ibnex.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/ib/ibnex/ibnex_devctl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <sys/ib/ibtl/impl/ibtl_ibnex.h>
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    36
#include <sys/ib/ibtl/impl/ibtl.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/file.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/sunndi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/fs/dv_node.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/mdi_impldefs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/sunmdi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    43
/* return the minimum value of (x) and (y) */
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    44
#define	MIN(x, y)	((x) < (y) ? (x) : (y))
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    45
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 * function prototypes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
int			ibnex_open(dev_t *, int, int, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
int			ibnex_close(dev_t, int, int, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
int			ibnex_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
int			ibnex_offline_childdip(dev_info_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
static int		ibnex_get_num_devices(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
static int		ibnex_get_snapshot(char **, size_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
static int		ibnex_get_commsvcnode_snapshot(nvlist_t **, ib_guid_t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
			    ib_guid_t, int, ib_pkey_t, ibnex_node_type_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
static int		ibnex_fill_ioc_tmp(nvlist_t **, ibdm_ioc_info_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
static int		ibnex_fill_nodeinfo(nvlist_t **, ibnex_node_data_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
			    void *);
12163
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
    60
static void		ibnex_figure_ap_devstate(ibnex_node_data_t *,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
			    devctl_ap_state_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
static void		ibnex_figure_ib_apid_devstate(devctl_ap_state_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
static	char 		*ibnex_get_apid(struct devctl_iocdata *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
static int		ibnex_get_dip_from_apid(char *, dev_info_t **,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
			    ibnex_node_data_t **);
12163
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
    66
extern int		ibnex_get_node_and_dip_from_guid(ib_guid_t, int,
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
    67
			    ib_pkey_t, ibnex_node_data_t **, dev_info_t **);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
static ibnex_rval_t	ibnex_handle_pseudo_configure(char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
static ibnex_rval_t	ibnex_handle_ioc_configure(char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
static ibnex_rval_t	ibnex_handle_commsvcnode_configure(char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
static void		ibnex_return_apid(dev_info_t *, char **);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
static void		ibnex_port_conf_entry_add(char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
static void		ibnex_vppa_conf_entry_add(char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
static void		ibnex_hcasvc_conf_entry_add(char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
static int		ibnex_port_conf_entry_delete(char *, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
static int		ibnex_vppa_conf_entry_delete(char *, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
static int		ibnex_hcasvc_conf_entry_delete(char *, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
static ibnex_rval_t	ibnex_ioc_fininode(dev_info_t *, ibnex_ioc_node_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
static ibnex_rval_t	ibnex_commsvc_fininode(dev_info_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
static ibnex_rval_t	ibnex_pseudo_fininode(dev_info_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    83
static int		ibnex_devctl(dev_t, int, intptr_t, int,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    84
			    cred_t *, int *);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    85
static int		ibnex_ctl_get_api_ver(dev_t, int, intptr_t, int,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    86
			    cred_t *, int *);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    87
static int		ibnex_ctl_get_hca_list(dev_t, int, intptr_t, int,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    88
			    cred_t *, int *);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    89
static int		ibnex_ctl_query_hca(dev_t, int, intptr_t, int,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    90
			    cred_t *, int *);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    91
static int		ibnex_ctl_query_hca_port(dev_t, int, intptr_t, int,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    92
			    cred_t *, int *);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
    93
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
extern uint64_t		ibnex_str2hex(char *, int, int *);
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
    95
extern int		ibnex_ioc_initnode_all_pi(ibdm_ioc_info_t *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
extern dev_info_t	*ibnex_commsvc_initnode(dev_info_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
			    ibdm_port_attr_t *, int, int, ib_pkey_t, int *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
			    int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
extern int		ibnex_get_dip_from_guid(ib_guid_t, int,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
			    ib_pkey_t, dev_info_t **);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
extern void		ibnex_reprobe_ioc_dev(void *arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
extern void		ibnex_reprobe_ioc_all();
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   103
extern int		ibnex_pseudo_create_all_pi(ibnex_node_data_t *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
extern void		ibnex_pseudo_initnodes(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
extern ibnex_t	ibnex;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
 * ibnex_open()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
ibnex_open(dev_t *dev, int flag, int otyp, cred_t *credp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	IBTF_DPRINTF_L4("ibnex", "\topen");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
 * ibnex_close()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
ibnex_close(dev_t dev, int flag, int otyp, cred_t *credp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	IBTF_DPRINTF_L4("ibnex", "\tclose");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   131
int
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   132
ibnex_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   133
    int *rvalp)
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   134
{
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   135
	/*
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   136
	 * For all generic devctl ioctls (such as DEVCTL_AP_CONFIGURE),
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   137
	 * call ibnex_devctl().
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   138
	 */
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   139
	if (IS_DEVCTL(cmd))
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   140
		return (ibnex_devctl(dev, cmd, arg, mode, credp, rvalp));
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   141
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   142
	/*
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   143
	 * The rest are ibnex specific ioctls.
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   144
	 */
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   145
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   146
	switch (cmd) {
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   147
	case IBNEX_CTL_GET_API_VER:
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   148
		return (ibnex_ctl_get_api_ver(dev, cmd, arg, mode,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   149
		    credp, rvalp));
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   150
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   151
	case IBNEX_CTL_GET_HCA_LIST:
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   152
		return (ibnex_ctl_get_hca_list(dev, cmd, arg, mode,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   153
		    credp, rvalp));
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   154
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   155
	case IBNEX_CTL_QUERY_HCA:
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   156
		return (ibnex_ctl_query_hca(dev, cmd, arg, mode,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   157
		    credp, rvalp));
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   158
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   159
	case IBNEX_CTL_QUERY_HCA_PORT:
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   160
		return (ibnex_ctl_query_hca_port(dev, cmd, arg, mode,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   161
		    credp, rvalp));
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   162
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   163
	default:
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   164
		return (EINVAL);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   165
	}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   166
}
0
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
 * ibnex_ioctl()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
 *	Ioctl routine for cfgadm controls
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
 *	DEVCTL_AP_GETSTATE:	returns attachment point state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
 *	DEVCTL_AP_CONTROL:	Does "ibnex" specific ioctls listed below
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
 *		IBNEX_NUM_DEVICE_NODES	Gives how many device nodes exist?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
 *		IBNEX_NUM_HCA_NODES	Gives how many HCAs exist in the fabric
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
 *		IBNEX_UPDATE_PKEY_TBLS	"-x update_pkey_tbls"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
 *		IBNEX_GET_SNAPSHOT	Gets the "snapshot" back to user-land
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
 *		IBNEX_SNAPSHOT_SIZE	What is "snapshot" size
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
 *		IBNEX_DEVICE_PATH_SZ	What is device-path size
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
 *		IBNEX_GET_DEVICE_PATH	Gets the device path for Dynamic ap
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
 *		IBNEX_HCA_LIST_SZ	"-x list" option size for the HCA ap_id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
 *		IBNEX_HCA_LIST_INFO	"-x list" option info for the HCA ap_id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
 *		IBNEX_UNCFG_CLNTS_SZ	"-x unconfig_client option size"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
 *		IBNEX_UNCFG_CLNTS_INFO	"-x unconfig_client data"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
 *		IBNEX_CONF_ENTRY_ADD:	"-x add_service"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
 *		IBNEX_CONF_ENTRY_DEL:	"-x delete_service"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
 *		IBNEX_HCA_VERBOSE_SZ:	"-alv hca_apid data size"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
 *		IBNEX_HCA_VERBOSE_INFO: "-alv hca_apid actual data"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
 *		IBNEX_UPDATE_IOC_CONF	"-x update_ioc_conf"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
 *	DEVCTL_AP_CONFIGURE:	"configure" the attachment point
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
 *	DEVCTL_AP_UNCONFIGURE:	"unconfigure" the attachment point
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
/* ARGSUSED */
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   193
static int
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   194
ibnex_devctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
    int *rvalp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	int			ret, rv = 0, ioc_reprobe_pending = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	int			circ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	char			*snapshot = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	char			*apid_n = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	char			*service = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	char			*devnm = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	char			*msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	char			*guid_str;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	uint_t			num_hcas = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	size_t			snapshot_sz  = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	uint32_t		ssiz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	uint32_t		apid_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	ib_guid_t		hca_guid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	boolean_t		apid_alloced = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	dev_info_t		*apid_dip = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	dev_info_t		*pdip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	ibnex_rval_t		ret_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	ib_service_type_t	svc_type = IB_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	devctl_ap_state_t	ap_state;
12163
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
   216
	ibnex_node_data_t	*nodep = NULL;
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
   217
	ibnex_node_data_t	*scanp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	struct devctl_iocdata	*dcp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   220
	IBTF_DPRINTF_L4("ibnex", "\tdevctl: cmd=%x, arg=%p, mode=%x, cred=%p, "
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	    "\t\trval=%p dev=0x%x", cmd, arg, mode, credp, rvalp, dev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	/* read devctl ioctl data */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	if ((cmd != DEVCTL_AP_CONTROL) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	    (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
		IBTF_DPRINTF_L4("ibnex",
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   227
		    "\tdevctl: ndi_dc_allochdl failed\n");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
		return (EFAULT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	case DEVCTL_AP_GETSTATE:
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   234
		msg = "\tdevctl: DEVCTL_AP_GETSTATE";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
		IBTF_DPRINTF_L4("ibnex", "%s:", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
		apid_n = ibnex_get_apid(dcp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
		if (*apid_n == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
			IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
			    "%s: ibnex_get_apid failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
			rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
		if (strncmp(apid_n, IBNEX_FABRIC, strlen(IBNEX_FABRIC)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
			ibnex_figure_ib_apid_devstate(&ap_state);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
			apid_dip = ibnex.ibnex_dip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
			/* if this apid is already seen by IBNEX, get the dip */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
			rv = ibnex_get_dip_from_apid(apid_n, &apid_dip, &nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
			if (rv != IBNEX_DYN_APID) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
				IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
				    "%s: ibnex_get_dip_from_apid failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
				rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
			if (apid_dip)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
				ndi_rele_devi(apid_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
			/* rv could be something undesirable, so reset it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
			rv = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
12163
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
   262
			ibnex_figure_ap_devstate(nodep, &ap_state);
0
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
		/* copy the return-AP-state information to the user space */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
		if (ndi_dc_return_ap_state(&ap_state, dcp) != NDI_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
			IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
			    "%s: ndi_dc_return_ap_state failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
			rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	case DEVCTL_AP_CONTROL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
		int			num_nodes = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
		ibnex_ioctl_data_t	ioc;	/* for 64-bit copies only */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   278
		msg = "\tdevctl: DEVCTL_AP_CONTROL";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
#ifdef	_MULTI_DATAMODEL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
		if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
			ibnex_ioctl_data_32_t ioc32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
			if (ddi_copyin((void *)arg, &ioc32,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
			    sizeof (ioc32), mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
				IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
				    "%s: ddi_copyin err 1", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
				rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
			ioc.cmd		= (uint_t)ioc32.cmd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
			ioc.buf		= (caddr_t)(uintptr_t)ioc32.buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
			ioc.bufsiz	= (uint_t)ioc32.bufsiz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
			ioc.ap_id	= (caddr_t)(uintptr_t)ioc32.ap_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
			ioc.ap_id_len	= (uint_t)ioc32.ap_id_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
			ioc.misc_arg	= (uint_t)ioc32.misc_arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
		if (ddi_copyin((void *)arg, &ioc, sizeof (ioc),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
		    mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
			IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
			    "%s: ddi_copyin 2 failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
			rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
#endif	/* _MULTI_DATAMODEL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
		IBTF_DPRINTF_L4("ibnex", "%s: \n\tioc: cmd=%x buf=%p, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
		    "bufsiz=%d", msg, ioc.cmd, ioc.buf, ioc.bufsiz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
		 * figure out ap_id name as passed from user-land
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
		 * NOTE: We don't need to figure out ap_id for these
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
		 * two sub-commands:-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
		 *	IBNEX_NUM_DEVICE_NODES, IBNEX_NUM_HCA_NODES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
		 * Hence, In user-land, these two ioctls force "ap_id_len" to 0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
		if (ioc.ap_id_len > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
			apid_alloced = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
			apid_len = ioc.ap_id_len + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
			apid_n = kmem_zalloc(apid_len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
			if (ddi_copyin((void *)ioc.ap_id, apid_n,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
			    ioc.ap_id_len, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
				IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
				    "%s: ddi_copyin err 3", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
				rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
			IBTF_DPRINTF_L3("ibnex", "%s: apid_n= %s", msg, apid_n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
		/* process sub-commands */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		switch (ioc.cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
		case IBNEX_NUM_DEVICE_NODES:
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   337
			msg = "\tdevctl: DEVCTL_AP_CONTROL: NUM_DEVICE_NODES";
0
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
			 * figure out how many IOC, VPPA,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
			 * Pseudo and Port nodes are present
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
			num_nodes = ibnex_get_num_devices();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
			IBTF_DPRINTF_L4("ibnex", "%s: num_nodes = %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
			    msg, num_nodes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
			if (ddi_copyout(&num_nodes, ioc.buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
			    ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
				IBTF_DPRINTF_L2("ibnex", "%s: copyout", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
				rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
			mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
			return (rv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
		case IBNEX_NUM_HCA_NODES:
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   356
			msg = "\tdevctl: DEVCTL_AP_CONTROL: NUM_HCA_NODES";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
			/* figure out how many HCAs are present in the host */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
			mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
			num_hcas = ibt_get_hca_list(NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
			IBTF_DPRINTF_L4("ibnex", "%s: num %d", msg, num_hcas);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
			if (ddi_copyout(&num_hcas, ioc.buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
			    ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
				IBTF_DPRINTF_L2("ibnex", "%s: copyout", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
				rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
			return (rv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
		case IBNEX_UPDATE_PKEY_TBLS:
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   371
			msg = "\tdevctl: DEVCTL_AP_CONTROL: UPDATE_PKEY_TBLS";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
			IBTF_DPRINTF_L4("ibnex", "%s", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
			 * update P_Key tables:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
			 *	ibdm_ibnex_update_pkey_tbls() calls
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
			 *	ibt_query_hca_ports_byguids() for all the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
			 *	HCAs that the IBDM has "seen" in the system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
			 *	This ends up updating the IBTL P_Key database.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
			 *	NOTE: Changes in this area will break this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
			 *	assumption. Initially the plan was to call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
			 *	ibt_query_hca_ports_byguids() in IBTL but
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
			 *	IBDM needs to call it as well. So, eliminating
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
			 *	the first invocation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
			 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
			 *	It next updates the DM P_Key database.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
			 *	Note that the DM P_Key database updating
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
			 *	will always be driven through cfgadm.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
			mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
			ibdm_ibnex_update_pkey_tbls();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
			mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
		case IBNEX_GET_SNAPSHOT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
		case IBNEX_SNAPSHOT_SIZE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
			msg = (ioc.cmd == IBNEX_SNAPSHOT_SIZE) ?
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   398
			    "\tdevctl: DEVCTL_AP_CONTROL: IBNEX_SNAPSHOT_SIZE" :
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   399
			    "\tdevctl: DEVCTL_AP_CONTROL: IBNEX_GET_SNAPSHOT";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
			IBTF_DPRINTF_L4("ibnex", "%s:", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
			if (ibnex_get_snapshot(&snapshot, &snapshot_sz,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
			    ioc.misc_arg) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
				IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
				    "%s:\n\tibnex_get_snapshot failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
				rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
			/* ssiz needs to be reinitialized again */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
			ssiz = snapshot_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
			IBTF_DPRINTF_L4("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
			    "%s:\n\tsize =%x", msg, snapshot_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
			if (ioc.cmd == IBNEX_SNAPSHOT_SIZE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
				if (ddi_copyout(&ssiz, ioc.buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
				    ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
					    "%s:\n\tddi_copyout 2 failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
					rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
				if (ioc.bufsiz != snapshot_sz) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
					    "%s:\n\tinvalid buffer size (%x %x)"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
					    " ", msg, ioc.bufsiz, snapshot_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
					rv = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
				} else if (ddi_copyout(snapshot, ioc.buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
				    ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
					    "%s:\n\tddi_copyout 3 failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
					rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
			kmem_free(snapshot, snapshot_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
		case IBNEX_DEVICE_PATH_SZ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
		case IBNEX_GET_DEVICE_PATH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
			char	 path[MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
			msg = (ioc.cmd == IBNEX_DEVICE_PATH_SZ) ?
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   448
			    "\tdevctl:DEVCTL_AP_CONTROL: IBNEX_DEVICE_PATH_SZ" :
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   449
			    "\tdevctl:DEVCTL_AP_CONTROL: IBNEX_GET_DEVICE_PATH";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
			IBTF_DPRINTF_L4("ibnex", "%s: apid = %s", msg, apid_n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
			/* if this apid is already seen by IBNEX, get the dip */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
			rv = ibnex_get_dip_from_apid(apid_n, &apid_dip, &nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
			if (rv != IBNEX_DYN_APID || apid_dip == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
				IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
				    "%s:\n\tget_dip_from_apid failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
				rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
			ndi_rele_devi(apid_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
			/* ddi_pathname doesn't supply /devices, so we do. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
			(void) strcpy(path, "/devices");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
			(void) ddi_pathname(apid_dip, path + strlen(path));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
			ssiz = (uint32_t)strlen(path) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
			IBTF_DPRINTF_L4("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
			    "%s: len = %x\n\tpath = %s", msg, ssiz, path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
			/* rv could be something undesirable, so reset it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
			rv = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
			if (ioc.cmd == IBNEX_DEVICE_PATH_SZ) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
				if (ddi_copyout(&ssiz, ioc.buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
				    ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
					    "%s: ddi_copyout 4 failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
					rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
				if (ioc.bufsiz != ssiz) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
					    "%s: invalid size (%x, %x)",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
					    msg, ioc.bufsiz, ssiz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
					rv = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
				} else if (ddi_copyout(&path, ioc.buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
				    ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
					IBTF_DPRINTF_L2("ibnex", "%s "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
					    "ddi_copyout 5 failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
					rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
		case IBNEX_HCA_LIST_SZ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
		case IBNEX_HCA_LIST_INFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
			msg = (ioc.cmd == IBNEX_HCA_LIST_SZ) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
			    "DEVCTL_AP_CONTROL: IBNEX_HCA_LIST_SZ" :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
			    "DEVCTL_AP_CONTROL: IBNEX_HCA_LIST_INFO";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
			guid_str = strrchr(apid_n, ':') + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
			IBTF_DPRINTF_L4("ibnex", "%s, input apid = %s, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
			    "guid = %s", msg, apid_n, guid_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
			if (guid_str == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
				IBTF_DPRINTF_L2("ibnex", "%s: invalid input "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
				    "GUID passed %s", msg, guid_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
				rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
			/* Get the GUID(hex value) from apid_n */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
			hca_guid = ibnex_str2hex(guid_str, strlen(guid_str),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
			    &ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
			if (ret != IBNEX_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
				IBTF_DPRINTF_L2("ibnex", "%s: Invalid HCA "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
				    "GUID string", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
				rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
			IBTF_DPRINTF_L4("ibnex", "%s HCA GUID = %llX",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
			    msg, hca_guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
			if (ibtl_ibnex_get_hca_info(hca_guid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
			    IBTL_IBNEX_LIST_CLNTS_FLAG, &snapshot, &snapshot_sz,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
			    ibnex_return_apid) != IBT_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
				IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
				    "%s: get HCA consumers failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
				rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
			ssiz = snapshot_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
			IBTF_DPRINTF_L4("ibnex", "%s: size =%x", msg, ssiz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
			if (ioc.cmd == IBNEX_HCA_LIST_SZ) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
				if (ddi_copyout(&ssiz, ioc.buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
				    ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
					    "%s: ddi_copyout 6 failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
					rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
				if (ioc.bufsiz != ssiz) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
					IBTF_DPRINTF_L2("ibnex", "%s: invalid "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
					    "size (%x, %x)", msg, ioc.bufsiz,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
					    ssiz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
					rv = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
				} else if (ddi_copyout(snapshot, ioc.buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
				    ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
					IBTF_DPRINTF_L2("ibnex", "%s "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
					    "ddi_copyout 7 failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
					rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
			kmem_free(snapshot, snapshot_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
		case IBNEX_UNCFG_CLNTS_SZ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
		case IBNEX_UNCFG_CLNTS_INFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
			msg = (ioc.cmd == IBNEX_UNCFG_CLNTS_SZ) ?
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   564
			    "\tdevctl:DEVCTL_AP_CONTROL: IBNEX_UNCFG_CLNTS_SZ" :
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   565
			    "\tdevctl:DEVCTL_AP_CONTROL: "
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   566
			    "IBNEX_UNCFG_CLNTS_INFO";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
			guid_str = strrchr(apid_n, ':') + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
			IBTF_DPRINTF_L4("ibnex", "%s, apid = %s, guid = %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
			    msg, apid_n, guid_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
			if (guid_str == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
				IBTF_DPRINTF_L2("ibnex", "%s: invalid input "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
				    "GUID %s", msg, guid_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
				rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
			/* Get the GUID(hex value) from apid_n */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
			hca_guid = ibnex_str2hex(guid_str, strlen(guid_str),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
			    &ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
			if (ret != IBNEX_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
				IBTF_DPRINTF_L2("ibnex", "%s: Invalid HCA "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
				    "GUID string passed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
				rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
			IBTF_DPRINTF_L4("ibnex", "%s G = %llX", msg, hca_guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
			if (ibtl_ibnex_get_hca_info(hca_guid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
			    IBTL_IBNEX_UNCFG_CLNTS_FLAG, &snapshot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
			    &snapshot_sz, ibnex_return_apid) != IBT_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
				IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
				    "%s: get HCA consumers failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
				rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
			/* ssiz needs to be reinitialized again */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
			ssiz = snapshot_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
			IBTF_DPRINTF_L4("ibnex", "%s: size =%x", msg, ssiz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
			if (ioc.cmd == IBNEX_UNCFG_CLNTS_SZ) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
				if (ddi_copyout(&ssiz, ioc.buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
				    ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
					    "%s: ddi_copyout 9 failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
					rv = EFAULT;
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
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
				if (ioc.bufsiz != ssiz) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
					    "%s: invalid size (%x, %x)",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
					    msg, ioc.bufsiz, ssiz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
					rv = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
				} else if (ddi_copyout(snapshot, ioc.buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
				    ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
					IBTF_DPRINTF_L2("ibnex", "%s "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
					    "ddi_copyout 10 failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
					rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
			kmem_free(snapshot, snapshot_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
		case IBNEX_CONF_ENTRY_ADD:
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   628
			msg = "\tdevctl: IBNEX_CONF_ENTRY_ADD: ";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
			service = kmem_zalloc(ioc.bufsiz + 1, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
			/* read in the "service" name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
			if (ddi_copyin(ioc.buf, service,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
			    ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
				IBTF_DPRINTF_L2("ibnex", "%s: ddi_copyin err 6",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
				    msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
				rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
			/* read in the "service type" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
			svc_type = ioc.misc_arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
			IBTF_DPRINTF_L4("ibnex", "%s: service = %s, type = %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
			    msg, service, svc_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
			if (svc_type == IB_PORT_SERVICE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
				ibnex_port_conf_entry_add(service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
			} else if (svc_type == IB_VPPA_SERVICE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
				ibnex_vppa_conf_entry_add(service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
			} else if (svc_type == IB_HCASVC_SERVICE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
				ibnex_hcasvc_conf_entry_add(service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
			kmem_free(service, ioc.bufsiz + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
		case IBNEX_CONF_ENTRY_DEL:
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   655
			msg = "\tdevctl:IBNEX_CONF_ENTRY_DEL: ";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
			service = kmem_zalloc(ioc.bufsiz + 1, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
			/* read in the "service" name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
			if (ddi_copyin(ioc.buf, service,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
			    ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
				IBTF_DPRINTF_L2("ibnex", "%s: ddi_copyin err 7",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
				    msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
				rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
				break;
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
			/* read in the "service type" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
			svc_type = ioc.misc_arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
			IBTF_DPRINTF_L4("ibnex", "%s: service = %s, type = %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
			    msg, service, svc_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
			if (svc_type == IB_PORT_SERVICE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
				rv = ibnex_port_conf_entry_delete(msg, service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
			} else if (svc_type == IB_VPPA_SERVICE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
				rv = ibnex_vppa_conf_entry_delete(msg, service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
			} else if (svc_type == IB_HCASVC_SERVICE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
				rv = ibnex_hcasvc_conf_entry_delete(msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
				    service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
			kmem_free(service, ioc.bufsiz + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
		case IBNEX_HCA_VERBOSE_SZ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
		case IBNEX_HCA_VERBOSE_INFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
			msg = (ioc.cmd == IBNEX_HCA_VERBOSE_SZ) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
			    "DEVCTL_AP_CONTROL: IBNEX_HCA_VERBOSE_SZ" :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
			    "DEVCTL_AP_CONTROL: IBNEX_HCA_VERBOSE_INFO";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
			guid_str = strrchr(apid_n, ':') + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
			IBTF_DPRINTF_L4("ibnex", "%s, apid = %s, guid = %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
			    msg, apid_n, guid_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
			if (guid_str == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
				IBTF_DPRINTF_L2("ibnex", "%s: invalid GUID %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
				    msg, guid_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
				rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
			/* Get the GUID(hex value) from apid_n */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
			hca_guid = ibnex_str2hex(guid_str, strlen(guid_str),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
			    &ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
			if (ret != IBNEX_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
				IBTF_DPRINTF_L2("ibnex", "%s: Invalid HCA GUID "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
				    "string", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
				rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
			IBTF_DPRINTF_L4("ibnex", "%s HCA GUID = 0x%llX",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
			    msg, hca_guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
			if (ibtl_ibnex_get_hca_verbose_data(hca_guid, &snapshot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
			    &snapshot_sz) != IBT_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
				IBTF_DPRINTF_L2("ibnex", "%s: get HCA verbose "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
				    "data failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
				rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
			ssiz = snapshot_sz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
			IBTF_DPRINTF_L4("ibnex", "%s: size =%x", msg, ssiz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
			if (ioc.cmd == IBNEX_HCA_VERBOSE_SZ) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
				if (ddi_copyout(&ssiz, ioc.buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
				    ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
					    "%s: ddi_copyout 11 failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
					rv = EFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
				if (ioc.bufsiz != ssiz) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
					    "%s: invalid size (%x, %x)",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
					    msg, ioc.bufsiz, ssiz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
					rv = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
				} else if (ddi_copyout(snapshot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
				    ioc.buf, ioc.bufsiz, mode) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
					IBTF_DPRINTF_L2("ibnex", "%s "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
					    "ddi_copyout 12 failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
					rv = EFAULT;
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
			kmem_free(snapshot, snapshot_sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
		case IBNEX_UPDATE_IOC_CONF :
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
   747
			msg = "\tdevctl:IBNEX_UPDATE_IOC_CONF: ";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
			 * If IB fabric APID, call ibnex_update_all
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
			 * If IOC APID, get the apid dip and call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
			 * ibnex_update_ioc
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
			if (ioc.misc_arg == IBNEX_BASE_APID) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
				 * If reprobe is in progress or another reprobe
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
				 * is already waiting, wait.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
				if (ibnex.ibnex_reprobe_state != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
					if (ibnex.ibnex_reprobe_state ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
					    IBNEX_REPROBE_ALL_PROGRESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
						ibnex.ibnex_reprobe_state =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
						    IBNEX_REPROBE_ALL_WAIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
					while (ibnex.ibnex_reprobe_state) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
						cv_wait(&ibnex.ibnex_reprobe_cv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
						    &ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
					/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
					 * Pending reprobe all completed, return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
					 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
					break;
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
				/* Check if reprobe for any IOC is pending */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
				/* CONSTCOND */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
				while (1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
					ioc_reprobe_pending = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
					for (scanp = ibnex.ibnex_ioc_node_head;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
					    scanp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
					    scanp = scanp->node_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
						if (scanp->node_reprobe_state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
						    != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
							ioc_reprobe_pending =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
							    1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
							break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
						}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
					if (ioc_reprobe_pending == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
						ibnex.ibnex_reprobe_state &=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
						    ~IBNEX_REPROBE_IOC_WAIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
						break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
					ibnex.ibnex_reprobe_state =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
					    IBNEX_REPROBE_IOC_WAIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
					cv_wait(&ibnex.ibnex_reprobe_cv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
					    &ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
				 * Set the REPROBE_ALL_PROGRESS state &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
				 * start reprobe
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
				ibnex.ibnex_reprobe_state =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
				    IBNEX_REPROBE_ALL_PROGRESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
				mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
				ibnex_reprobe_ioc_all();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
				mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
			} else if (ioc.misc_arg == IBNEX_DYN_APID) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
				rv = ibnex_get_dip_from_apid(apid_n, &apid_dip,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
				    &nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
				ASSERT(rv == IBNEX_DYN_APID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
				/* Device unconfigured: return */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
				if (apid_dip == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
				ndi_rele_devi(apid_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
				/* Reset return value back to 0 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
				rv = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
				if (ibnex.ibnex_reprobe_state != 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
				    nodep->node_reprobe_state != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
					while (ibnex.ibnex_reprobe_state != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
					    nodep->node_reprobe_state != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
						cv_wait(&ibnex.ibnex_reprobe_cv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
						    &ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
					/* Pending reprobe completed, return */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
				/* Set node_reprobe_state and start reprobe */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
				nodep->node_reprobe_state =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
				    IBNEX_NODE_REPROBE_NOTIFY_ON_UPDATE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
				mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
				ibnex_reprobe_ioc_dev((void *)apid_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
				mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
				rv = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
			IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
			    "DEVCTL_AP_CONTROL: ioc:unknown cmd = %x", ioc.cmd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
	break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
	case DEVCTL_AP_UNCONFIGURE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
		msg = "DEVCTL_AP_UNCONFIGURE";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
		IBTF_DPRINTF_L4("ibnex", "%s", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
		/* Check for write permissions */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
		if (!(mode & FWRITE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
			IBTF_DPRINTF_L2("ibnex", "%s: invalid mode %x",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
			    msg, mode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
			rv = EPERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
		if ((apid_n = ibnex_get_apid(dcp)) == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
			IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
			    "%s: ibnex_get_apid failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
			rv = EIO;
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
		 * If this apid is already seen by IBNEX, get the dip
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
		 * NOTE: ibnex_get_dip_from_apid() finds a valid dip
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
		 * and also does a ndi_devi_hold() on the child.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
		rv = ibnex_get_dip_from_apid(apid_n, &apid_dip, &nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
		if ((rv != IBNEX_DYN_APID) || (apid_dip == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
			IBTF_DPRINTF_L2("ibnex", "%s: get_dip_from_apid "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
			    "failed with 0x%x", msg, rv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
			rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
		IBTF_DPRINTF_L4("ibnex", "%s: DIP = %p", msg, apid_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
		/* Check if it is a valid node type? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
		if (!IBNEX_VALID_NODE_TYPE(nodep)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
			IBTF_DPRINTF_L2("ibnex", "%s: invalid IB node", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
			rv = ENODEV;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
			ndi_rele_devi(apid_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
		 * continue unconfigure operation, only if device node
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
		 * is already configured. Return EBUSY if another
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
		 * configure/unconfigure operation is in progress.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
		if (nodep->node_state == IBNEX_CFGADM_CONFIGURING ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
		    nodep->node_state == IBNEX_CFGADM_UNCONFIGURING) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
			rv = EBUSY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
			ndi_rele_devi(apid_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
		/* do this before to avoid races */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
		nodep->node_dip = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
		nodep->node_state = IBNEX_CFGADM_UNCONFIGURING;
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
		 * Call devfs_clean first
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
		 * NOTE: The code so far is protected by holding ibnex_mutex
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
		 * and by doing a ndi_devi_hold() on the child.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
		pdip = ddi_get_parent(apid_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
		if (i_ddi_node_state(apid_dip) >= DS_INITIALIZED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
			devnm = kmem_alloc(MAXNAMELEN + 1, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
			(void) ddi_deviname(apid_dip, devnm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
			mutex_exit(&ibnex.ibnex_mutex);
4411
d3fb57af2eda 6565553 devfs_clean() should not be used to test for offlinability
vikram
parents: 1093
diff changeset
   920
			(void) devfs_clean(pdip, devnm + 1, DV_CLEAN_FORCE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
			mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
			kmem_free(devnm, MAXNAMELEN + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
		mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
		ndi_devi_enter(pdip, &circ);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
		ndi_rele_devi(apid_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
		mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
		/* unconfigure the Port/VPPA/HCA_SVC node */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
		if (IBNEX_COMMSVC_NODE_TYPE(nodep)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
			ret_val = ibnex_commsvc_fininode(apid_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
		} else if (nodep->node_type == IBNEX_IOC_NODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
			/* unconfigure the IOC node */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
			ret_val = ibnex_ioc_fininode(apid_dip,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
			    &nodep->node_data.ioc_node);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
		} else if (nodep->node_type == IBNEX_PSEUDO_NODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
			/* unconfigure the pseudo node */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
			ret_val = ibnex_pseudo_fininode(apid_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
		/* reset upon failure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
		if (ret_val != IBNEX_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
			nodep->node_dip = apid_dip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
			nodep->node_state = IBNEX_CFGADM_CONFIGURED;
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   946
		} else {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
			nodep->node_state = IBNEX_CFGADM_UNCONFIGURED;
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   948
			nodep->node_ap_state = IBNEX_NODE_AP_UNCONFIGURED;
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   949
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
		rv = (ret_val != IBNEX_SUCCESS) ? EIO : 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
		ndi_devi_exit(pdip, circ);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
		IBTF_DPRINTF_L2("ibnex", "%s: DONE !! It %s", msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
		    rv ? "failed" : "succeeded");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
	case DEVCTL_AP_CONFIGURE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
		msg = "DEVCTL_AP_CONFIGURE";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
		IBTF_DPRINTF_L4("ibnex", "%s", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
		mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
		ndi_devi_enter(ibnex.ibnex_dip, &circ);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
		mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
		/* Check for write permissions */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
		if (!(mode & FWRITE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
			IBTF_DPRINTF_L2("ibnex", "%s: invalid mode %x",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
			    msg, mode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
			rv = EPERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
			ndi_devi_exit(ibnex.ibnex_dip, circ);
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
		if ((apid_n = ibnex_get_apid(dcp)) == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
			IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
			    "%s: ibnex_get_apid failed", msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
			rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
			ndi_devi_exit(ibnex.ibnex_dip, circ);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
		/*
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   982
		 * Let's get the node if it already exists.
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   983
		 * NOTE: ibnex_get_dip_from_apid() finds a valid dip
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   984
		 * and also does a ndi_devi_hold() on the child.
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   985
		 */
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   986
		nodep = NULL;
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   987
		ret_val = ibnex_get_dip_from_apid(apid_n, &apid_dip, &nodep);
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   988
		/*
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   989
		 * We need the node_data but not the dip. If we get a dip for
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   990
		 * this apid, it means it's already configured. We need to
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   991
		 * return.
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   992
		 */
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   993
		if (apid_dip != NULL) {
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   994
			ndi_rele_devi(apid_dip);
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   995
			ndi_devi_exit(ibnex.ibnex_dip, circ);
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   996
			rv = 0;
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   997
			break;
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   998
		}
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
   999
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1000
		/*
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1001
		 * A node exits for this apid but not a dip. So we must have
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1002
		 * unconfigured it earlier. Set the node_ap_state to configuring
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1003
		 * to allow configure operation.
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1004
		 */
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1005
		if (nodep != NULL) {
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1006
			nodep->node_ap_state = IBNEX_NODE_AP_CONFIGURING;
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1007
		}
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1008
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1009
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1010
		/*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
		 * Five types of APIDs are supported:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
		 *	o HCA_GUID,0,service-name	(HCA-SVC device)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
		 *	o IOC_GUID 			(IOC device)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
		 *	o PORT_GUID,0,service-name	(Port device)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
		 *	o pseudo_name,unit-address, 	(Pseudo device)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
		 *	o PORT_GUID,P_Key,service-name	(VPPA device)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
		 * If the apid doesn't have "," then treat it as an IOC
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
		 * If the apid has one "," then it is Pseudo device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
		 * If the apid has 2 ","s then it is one of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
		 * Port,VPPA,HCA_SVC devices
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
		if (strrchr(apid_n, ',') == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
			ret_val = ibnex_handle_ioc_configure(apid_n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
			char *first = strchr(apid_n, ',');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
			char *second;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
			second = first ? strchr(first + 1, ',') : NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
			if (first != NULL && second == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
				ret_val = ibnex_handle_pseudo_configure(apid_n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
			} else if (first != NULL && second != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
				ret_val = ibnex_handle_commsvcnode_configure(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
				    apid_n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
		} /* end of else */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1037
		if (ret_val != IBNEX_SUCCESS) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
			rv = (ret_val == IBNEX_BUSY) ? EBUSY : EIO;
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1039
		} else {
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1040
			/*
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1041
			 * Get the newly created node and set the state to
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1042
			 * IBNEX_NODE_AP_CONFIGURED.
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1043
			 * NOTE: ibnex_get_dip_from_apid() finds a valid dip
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1044
			 * and also does a ndi_devi_hold() on the child.
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1045
			 */
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1046
			if (!nodep)
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1047
				ret_val = ibnex_get_dip_from_apid(apid_n,
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1048
				    &apid_dip, &nodep);
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1049
			if (nodep != NULL) {
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1050
				nodep->node_ap_state = IBNEX_NODE_AP_CONFIGURED;
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1051
			}
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1052
			if (apid_dip != NULL) {
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1053
				ndi_rele_devi(apid_dip);
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1054
			}
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1055
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
		IBTF_DPRINTF_L2("ibnex", "%s: DONE !! It %s", msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
		    rv ? "failed" : "succeeded");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
		ndi_devi_exit(ibnex.ibnex_dip, circ);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
		rv = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
	mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
	if ((apid_alloced == B_TRUE) && (apid_n != NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
		kmem_free(apid_n, apid_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
	if (dcp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
		ndi_dc_freehdl(dcp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
	return (rv);
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
 * ibnex_get_num_devices()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
 *	Figure out how many IOC, VPPA, Pseudo, HCA_SVC and Port devices exist
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
ibnex_get_num_devices(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
	int			j, k, l, hca_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
	int			num_nodes = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
	ibdm_hca_list_t		*hca_list, *hcap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
	ibdm_port_attr_t	*pattr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
	ibnex_node_data_t	*nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
	ASSERT(mutex_owned(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
	/* Get a count of HCAs, first. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
	mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
	ibdm_ibnex_get_hca_list(&hca_list, &hca_count);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
	mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
	for (hcap = hca_list; hca_list != NULL; hca_list = hca_list->hl_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
		for (j = 0; j < ibnex.ibnex_nhcasvc_comm_svcs; j++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
			num_nodes++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
		for (j = 0; j < hca_list->hl_nports; j++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
			for (k = 0; k < ibnex.ibnex_num_comm_svcs; k++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
				num_nodes++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
			pattr = &hca_list->hl_port_attr[j];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
			for (k = 0; k < pattr->pa_npkeys; k++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
				if (IBNEX_INVALID_PKEY(pattr->pa_pkey_tbl[k].
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
				    pt_pkey))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
					continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
				for (l = 0; l < ibnex.ibnex_nvppa_comm_svcs;
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1111
				    l++, ++num_nodes)
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1112
					;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
			} /* end of pa_npkeys */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
		} /* end of  hl_nports */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
	} /* end of hca_list != NULL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
	if (hcap)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
		ibdm_ibnex_free_hca_list(hcap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
	 * Now figure out how many IOC nodes are present.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
	 * Add count of configured "diconnected" IOCs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
	mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
	num_nodes += ibdm_ibnex_get_ioc_count();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
	mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
	num_nodes += ibnex.ibnex_num_disconnect_iocs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
	/* Last: figure out how many Pseudo nodes are present. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
	for (nodep = ibnex.ibnex_pseudo_node_head; nodep;
1093
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 0
diff changeset
  1130
	    nodep = nodep->node_next) {
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 0
diff changeset
  1131
		if (nodep->node_data.pseudo_node.pseudo_merge_node == 1)
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 0
diff changeset
  1132
			continue;
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 0
diff changeset
  1133
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 0
diff changeset
  1134
		num_nodes++;
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 0
diff changeset
  1135
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
	return (num_nodes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
 * ibnex_get_snapshot()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
 *	Get a snapshot of all Port/IOC/VPPA/HCA_SVC/Pseudo nodes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
 *	Snapshot includes IBNEX_NODE_INFO_NVL, IBNEX_NODE_TYPE_NVL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
 *	IBNEX_NODE_RSTATE_NVL, IBNEX_NODE_OSTATE_NVL and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
 *	IBNEX_NODE_COND_NVL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
ibnex_get_snapshot(char **buf, size_t *sz, int allow_probe)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
	int			i, j, k, l, hca_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
	nvlist_t		*nvl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
	ib_pkey_t 		pkey;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
	boolean_t		found;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
	ibdm_ioc_info_t		*ioc_listp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
	ibdm_ioc_info_t		*iocp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
	ibdm_hca_list_t		*hca_list, *hcap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
	ibdm_port_attr_t	*port_attr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
	ibnex_node_data_t	*nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
	ASSERT(mutex_owned(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
	*buf = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
	*sz = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
	if (!ibnex.ibnex_pseudo_inited) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
		mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
		ibnex_pseudo_initnodes();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
		mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
		ibnex.ibnex_pseudo_inited = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
	/* First, Port/VPPA/HCA_SVC nodes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
	mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
	ibdm_ibnex_get_hca_list(&hca_list, &hca_count);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
	mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
	(void) nvlist_alloc(&nvl, 0, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
	/* Go thru all the ports of all the HCAs and all the port-svc indices */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
	for (hcap = hca_list, i = 0; i < hca_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
	    hca_list = hca_list->hl_next, i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
		IBTF_DPRINTF_L4("ibnex", "ibnex_get_snapshot: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
		    "fill in  COMM service HCA_SVC nodes");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
		port_attr = hca_list->hl_hca_port_attr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
		for (j = 0; j < ibnex.ibnex_nhcasvc_comm_svcs; j++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
			if (ibnex_get_commsvcnode_snapshot(&nvl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
			    port_attr->pa_hca_guid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
			    port_attr->pa_hca_guid, j, (ib_pkey_t)0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
			    IBNEX_HCASVC_COMMSVC_NODE) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
				IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
				    "ibnex_get_snapshot: failed to fill"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
				    " HCA_SVC device (%x %x)", i, j);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
				ibdm_ibnex_free_hca_list(hcap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
				nvlist_free(nvl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
				return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
		for (j = 0; j < hca_list->hl_nports; j++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
			port_attr = &hca_list->hl_port_attr[j];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
			IBTF_DPRINTF_L4("ibnex", "ibnex_get_snapshot: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
			    "fill in  COMM service Port nodes");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
			for (k = 0; k < ibnex.ibnex_num_comm_svcs; k++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
				if (ibnex_get_commsvcnode_snapshot(&nvl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
				    port_attr->pa_hca_guid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
				    port_attr->pa_port_guid, k, (ib_pkey_t)0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
				    IBNEX_PORT_COMMSVC_NODE) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
					    "ibnex_get_snapshot: failed to fill"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
					    " Port device (%x %x %x)", i, j, k);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
					ibdm_ibnex_free_hca_list(hcap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
					nvlist_free(nvl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
					return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
			} /* end of num_comm_svcs for loop */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
			IBTF_DPRINTF_L4("ibnex", "ibnex_get_snapshot: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
			    "fill in  VPPA service port nodes");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
			for (l = 0; l < port_attr->pa_npkeys; l++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
				pkey = port_attr->pa_pkey_tbl[l].pt_pkey;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
				if (IBNEX_INVALID_PKEY(pkey))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
					continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
				for (k = 0; k < ibnex.ibnex_nvppa_comm_svcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
				    k++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
					if (ibnex_get_commsvcnode_snapshot(&nvl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
					    port_attr->pa_hca_guid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
					    port_attr->pa_port_guid, k, pkey,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
					    IBNEX_VPPA_COMMSVC_NODE) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
						IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
						    "ibnex_get_snapshot: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
						    "failed to fill VPPA "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
						    "device (%x %x %x % x)",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
						    i, j, k, l);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
						ibdm_ibnex_free_hca_list(hcap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
						nvlist_free(nvl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
						return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
				} /* end of ibnex_nvppa_comm_svcs loop */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
			} /* end of pa_npkeys for loop */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
		} /* end of hl_nports for loop */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
	} /* end of hca_count for loop */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
	if (hcap)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
		ibdm_ibnex_free_hca_list(hcap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
	/* save it to free up the entire list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
	mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
	iocp = ioc_listp = ibdm_ibnex_get_ioc_list(allow_probe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
	mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
	for (; ioc_listp != NULL; ioc_listp = ioc_listp->ioc_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
		 * Say we have N IOCs and all were deleted from ibnex
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
		 * but not from IBDM
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
		if (ibnex.ibnex_ioc_node_head == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
			if (ibnex_fill_ioc_tmp(&nvl, ioc_listp) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
				IBTF_DPRINTF_L2("ibnex", "ibnex_get_snapshot: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
				    "filling NVL data failed");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
				ibdm_ibnex_free_ioc_list(iocp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
				nvlist_free(nvl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
				return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
			found = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
			/* Check first, if we have already seen this IOC? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
			for (nodep = ibnex.ibnex_ioc_node_head; nodep != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
			    nodep = nodep->node_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
				if (ioc_listp->ioc_profile.ioc_guid ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
				    nodep->node_data.ioc_node.ioc_guid) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
					found = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
			/* have we seen this IOC before? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
			if (found == B_TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
				if (ibnex_fill_nodeinfo(&nvl, nodep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
				    &ioc_listp->ioc_profile) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
					    "ibnex_get_snapshot: filling NVL "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
					    "for IOC node %p failed", nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
					ibdm_ibnex_free_ioc_list(iocp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
					nvlist_free(nvl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
					return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
				if (ibnex_fill_ioc_tmp(&nvl, ioc_listp) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
					    "ibnex_get_snapshot: filling NVL "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
					    "tmp for IOC node %p failed",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
					    ioc_listp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
					ibdm_ibnex_free_ioc_list(iocp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
					nvlist_free(nvl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
					return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
		} /* end of else ibnex_ioc_node_head == NULL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
	} /* end of external for */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
	ibdm_ibnex_free_ioc_list(iocp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
	 * Add list of "disconnected" IOCs, not unconfigured.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
	for (nodep = ibnex.ibnex_ioc_node_head; nodep != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
	    nodep = nodep->node_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
		if (nodep->node_data.ioc_node.ioc_ngids == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
		    nodep->node_data.ioc_node.ioc_profile != NULL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
		    nodep->node_state != IBNEX_CFGADM_UNCONFIGURED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
			if (ibnex_fill_nodeinfo(&nvl, nodep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
			    nodep->node_data.ioc_node.ioc_profile) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
					IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
					    "ibnex_get_snapshot: filling NVL "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
					    "for disconnected IOC node %p "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
					    "failed", nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
					nvlist_free(nvl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
					return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
	/* lastly; pseudo nodes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
	for (nodep = ibnex.ibnex_pseudo_node_head; nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
	    nodep = nodep->node_next) {
1093
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 0
diff changeset
  1343
		if (nodep->node_data.pseudo_node.pseudo_merge_node == 1)
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 0
diff changeset
  1344
			continue;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
		if (ibnex_fill_nodeinfo(&nvl, nodep, NULL) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
			IBTF_DPRINTF_L2("ibnex", "ibnex_get_snapshot: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
			    "filling NVL data for Pseudo %p failed", nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
			nvlist_free(nvl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
	/* pack the data into the buffer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
	if (nvlist_pack(nvl, buf, sz, NV_ENCODE_NATIVE, KM_SLEEP)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
		IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
		    "ibnex_get_snapshot: nvlist_pack failed");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
		nvlist_free(nvl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
	IBTF_DPRINTF_L4("ibnex", "ibnex_get_snapshot: size = 0x%x", *sz);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
	nvlist_free(nvl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
 * ibnex_get_commsvcnode_snapshot()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
 *	A utility function to fill in a "dummy" Port/VPPA/HCA_SVC
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
 *	information. Cfgadm plugin will display all Port/VPPA/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
 *	HCA_SVCs seen even if they are not all configured by IBNEX.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
 *	This function uses information from IBDM to fill up Port/VPPA/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
 *	HCA_SVC snapshot. If none exists then it makes up a "temporary"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
 *	node which will be displayed as "connected/unconfigured/unknown".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
 *	For HCA_SVC node port_guid will be same as hca_guid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
ibnex_get_commsvcnode_snapshot(nvlist_t **nvlpp, ib_guid_t hca_guid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
    ib_guid_t port_guid, int svc_index, ib_pkey_t p_key,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
    ibnex_node_type_t node_type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
	int			rval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
	dev_info_t		*dip = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
	ibnex_node_data_t	*nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
	ibnex_node_data_t	dummy;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
	ibnex_node_data_t	*tmp = &dummy;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
	IBTF_DPRINTF_L4("ibnex", "ibnex_get_commsvcnode_snapshot: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
	    "HCA GUID: %llX Port GUID: %llX svc_index = %x pkey = %x "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
	    "node_type = %x", hca_guid, port_guid, svc_index, p_key, node_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
	/* check if this node was seen before? */
12163
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
  1395
	rval = ibnex_get_node_and_dip_from_guid(port_guid, svc_index, p_key,
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
  1396
	    &nodep, &dip);
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
  1397
	if (rval == IBNEX_SUCCESS && nodep != NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
		if (ibnex_fill_nodeinfo(nvlpp, nodep, NULL) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
			IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
			    "ibnex_get_commsvcnode_snapshot: failed to fill "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
			    "Port/VPPA device node %p NVL data", nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
		/* Fake up a Port/VPPA/HCA_SVC node */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
		IBTF_DPRINTF_L4("ibnex", "ibnex_get_commsvcnode_snapshot: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
		    "VPPA/Port/HCA_SVC not seen by ibnex");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
		bzero(tmp, sizeof (ibnex_node_data_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
		tmp->node_type = node_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
		tmp->node_data.port_node.port_guid = port_guid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
		tmp->node_data.port_node.port_hcaguid = hca_guid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
		tmp->node_data.port_node.port_commsvc_idx = svc_index;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
		/* Fill P_Key only for VPPA nodes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
		if (node_type == IBNEX_VPPA_COMMSVC_NODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
			tmp->node_data.port_node.port_pkey = p_key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
		if (ibnex_fill_nodeinfo(nvlpp, tmp, NULL) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
			IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
			    "ibnex_get_commsvcnode_snapshot: failed to fill "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
			    "tmp Port/VPPA device node %p NVL data", tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
 * ibnex_fill_ioc_tmp()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
 *	A utility function to fill in a "dummy" IOC information.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
 *	Cfgadm plugin will display all IOCs seen by IBDM even if they
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
 *	are configured or not by IBNEX.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
 *	This function uses information from IBDM to fill up a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
 *	dummy IOC information. It will be displayed as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
 *	"connected/unconfigured/unknown".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
ibnex_fill_ioc_tmp(nvlist_t **nvlpp, ibdm_ioc_info_t *ioc_listp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
	ibnex_node_data_t	dummy;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
	ibnex_node_data_t	*nodep = &dummy;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
	IBTF_DPRINTF_L4("ibnex", "\tibnex_fill_ioc_tmp:");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
	bzero(nodep, sizeof (ibnex_node_data_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
	nodep->node_type = IBNEX_IOC_NODE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
	nodep->node_data.ioc_node.ioc_guid = ioc_listp->ioc_profile.ioc_guid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
	nodep->node_data.ioc_node.iou_guid = ioc_listp->ioc_iou_guid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
	(void) strncpy(nodep->node_data.ioc_node.ioc_id_string,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
	    (char *)ioc_listp->ioc_profile.ioc_id_string,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
	    IB_DM_IOC_ID_STRING_LEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
	IBTF_DPRINTF_L4("ibnex", "\tibnex_fill_ioc_tmp: %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
	    nodep->node_data.ioc_node.ioc_id_string);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
	if (ibnex_fill_nodeinfo(nvlpp, nodep, &ioc_listp->ioc_profile) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
		IBTF_DPRINTF_L2("ibnex", "\tibnex_fill_ioc_tmp: filling NVL "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
		    "data for IOC node %p failed", nodep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
 * ibnex_fill_nodeinfo()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
 *	A utility function to fill in to the NVLIST information about
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
 *	a Port/IOC/VPPA/HCA_SVC/Pseudo driver that is then passed over
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
 *	to cfgadm utility for display. This information is used only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
 *	for cfgadm -ll displays.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
 *	Information that is filled in here is:-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
 *		AP_ID_NAME
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
 *		AP_ID_INFO
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
 *		AP_ID_TYPE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
 *		AP_ID_OCCUPANT_STATE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
 *		AP_ID_RECEPTACLE_STATE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
 *		AP_ID_CONDITION
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
ibnex_fill_nodeinfo(nvlist_t **nvlpp, ibnex_node_data_t *node_datap, void *tmp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
	char			*svcname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
	char			*node_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
	char			apid[IBTL_IBNEX_APID_LEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
	char			info_data[MAXNAMELEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
	ib_dm_ioc_ctrl_profile_t *profilep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
	devctl_ap_state_t	state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
	IBTF_DPRINTF_L5("ibnex", "ibnex_fill_nodeinfo: 0x%x addr is %p",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
	    node_datap->node_type, node_datap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
	if (node_datap->node_type == IBNEX_PORT_COMMSVC_NODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
		svcname = ibnex.ibnex_comm_svc_names[node_datap->node_data.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1500
		    port_node.port_commsvc_idx];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
		(void) snprintf(apid, IBTL_IBNEX_APID_LEN, "%llX,0,%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
		    (longlong_t)node_datap->node_data.port_node.port_guid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
		    svcname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
		/* Node APID */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
		if (nvlist_add_string(*nvlpp, IBNEX_NODE_APID_NVL, apid)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
			IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
			    "failed to fill %s", IBNEX_NODE_APID_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
		/* Node Info */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
		if (nvlist_add_string(*nvlpp, IBNEX_NODE_INFO_NVL, svcname)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
			IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
			    "failed to fill Port %s", IBNEX_NODE_INFO_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
		IBTF_DPRINTF_L5("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
		    "Port %s = %s, %s = %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
		    IBNEX_NODE_INFO_NVL, apid, IBNEX_NODE_APID_NVL, svcname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
	} else if (node_datap->node_type == IBNEX_VPPA_COMMSVC_NODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
		svcname = ibnex.ibnex_vppa_comm_svc_names[node_datap->node_data.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
		    port_node.port_commsvc_idx];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
		(void) snprintf(apid, IBTL_IBNEX_APID_LEN, "%llX,%x,%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
		    (longlong_t)node_datap->node_data.port_node.port_guid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
		    node_datap->node_data.port_node.port_pkey, svcname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
		/* Node APID */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
		if (nvlist_add_string(*nvlpp, IBNEX_NODE_APID_NVL, apid)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
			IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
			    "failed to fill %s", IBNEX_NODE_APID_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1537
		/* Node Info */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1538
		if (nvlist_add_string(*nvlpp, IBNEX_NODE_INFO_NVL, svcname)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
			IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
			    "failed to fill VPPA %s", IBNEX_NODE_INFO_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1541
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1542
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1543
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1544
		IBTF_DPRINTF_L5("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1545
		    "VPPA %s = %s, %s = %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1546
		    IBNEX_NODE_APID_NVL, apid, IBNEX_NODE_INFO_NVL, svcname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1548
	} else if (node_datap->node_type == IBNEX_HCASVC_COMMSVC_NODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
		svcname = ibnex.ibnex_hcasvc_comm_svc_names[node_datap->
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
		    node_data.port_node.port_commsvc_idx];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
		(void) snprintf(apid, IBTL_IBNEX_APID_LEN, "%llX,0,%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
		    (longlong_t)node_datap->node_data.port_node.port_guid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
		    svcname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1554
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1555
		/* Node APID */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
		if (nvlist_add_string(*nvlpp, IBNEX_NODE_APID_NVL, apid)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
			IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
			    "failed to fill %s", IBNEX_NODE_APID_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1561
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1562
		/* Node Info */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1563
		if (nvlist_add_string(*nvlpp, IBNEX_NODE_INFO_NVL, svcname)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1564
			IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1565
			    "failed to fill Port %s", IBNEX_NODE_INFO_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1567
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1569
		IBTF_DPRINTF_L5("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
		    "Port %s = %s, %s = %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
		    IBNEX_NODE_INFO_NVL, apid, IBNEX_NODE_APID_NVL, svcname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1573
	} else if (node_datap->node_type == IBNEX_IOC_NODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1574
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
		 * get the IOC profile pointer from the args
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1577
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1578
		profilep = (ib_dm_ioc_ctrl_profile_t *)tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1579
		IBNEX_FORM_GUID(apid, IBTL_IBNEX_APID_LEN, profilep->ioc_guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
		/* Node APID */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
		if (nvlist_add_string(*nvlpp, IBNEX_NODE_APID_NVL, apid)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
			IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
			    "failed to fill in %s", IBNEX_NODE_APID_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
		IBTF_DPRINTF_L5("ibnex", "ibnex_fill_nodeinfo: %s %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
		    IBNEX_NODE_APID_NVL, apid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
		 * IOC "info" filed will display the following fields
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
		 * VendorID, IOCDeviceID, DeviceVersion, SubsystemVendorID,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
		 * SubsystemID, Class, Subclass, Protocol, ProtocolVersion
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
		(void) snprintf(info_data, MAXNAMELEN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
		    "VID: 0x%x DEVID: 0x%x VER: 0x%x SUBSYS_VID: 0x%x "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
		    "SUBSYS_ID: 0x%x CLASS: 0x%x SUBCLASS: 0x%x PROTO: 0x%x "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
		    "PROTOVER: 0x%x ID_STRING: %s", profilep->ioc_vendorid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
		    profilep->ioc_deviceid, profilep->ioc_device_ver,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
		    profilep->ioc_subsys_vendorid, profilep->ioc_subsys_id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
		    profilep->ioc_io_class, profilep->ioc_io_subclass,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
		    profilep->ioc_protocol, profilep->ioc_protocol_ver,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
		    (char *)profilep->ioc_id_string);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
		IBTF_DPRINTF_L5("ibnex", "ibnex_fill_nodeinfo: %s", info_data);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
		/* Node Info */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
		if (nvlist_add_string(*nvlpp, IBNEX_NODE_INFO_NVL, info_data)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1608
			IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
			    "failed to fill IOC %s", IBNEX_NODE_INFO_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1610
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
	} else if (node_datap->node_type == IBNEX_PSEUDO_NODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
		(void) snprintf(apid, IBTL_IBNEX_APID_LEN, "%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
		    node_datap->node_data.pseudo_node.pseudo_node_addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
		/* Node APID */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
		if (nvlist_add_string(*nvlpp, IBNEX_NODE_APID_NVL, apid)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
			IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
			    "failed to fill in %s", IBNEX_NODE_APID_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
		/* Node Info */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
		node_name = node_datap->node_data.pseudo_node.pseudo_devi_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
		(void) snprintf(info_data, MAXNAMELEN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
		    "Pseudo Driver = \"%s\", Unit-address = \"%s\"",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
		    node_name, apid + strlen(node_name) + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
		if (nvlist_add_string(*nvlpp, IBNEX_NODE_INFO_NVL, info_data)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
			IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
			    "failed to fill Pseudo %s", IBNEX_NODE_INFO_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
		IBTF_DPRINTF_L5("ibnex", "ibnex_fill_nodeinfo: Pseudo %s = %s,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
		    "%s = %s", IBNEX_NODE_APID_NVL, apid, IBNEX_NODE_INFO_NVL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
		    info_data);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
	/* Node type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
	if (nvlist_add_int32(*nvlpp, IBNEX_NODE_TYPE_NVL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
	    node_datap->node_type)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
		IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
		    "failed to fill in %s", IBNEX_NODE_TYPE_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1647
	IBTF_DPRINTF_L5("ibnex", "ibnex_fill_nodeinfo: %s %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1648
	    IBNEX_NODE_TYPE_NVL, node_datap->node_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1650
	/* figure out "ostate", "rstate" and "condition" */
12163
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
  1651
	ibnex_figure_ap_devstate(node_datap, &state);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
	if (nvlist_add_int32(*nvlpp, IBNEX_NODE_RSTATE_NVL, state.ap_rstate)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
		IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
		    "failed to fill in %s", IBNEX_NODE_RSTATE_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1658
	IBTF_DPRINTF_L5("ibnex", "ibnex_fill_nodeinfo: %s %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1659
	    IBNEX_NODE_RSTATE_NVL, state.ap_rstate);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1660
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
	if (nvlist_add_int32(*nvlpp, IBNEX_NODE_OSTATE_NVL, state.ap_ostate)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1662
		IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1663
		    "failed to fill in %s", IBNEX_NODE_OSTATE_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1664
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1665
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1666
	IBTF_DPRINTF_L5("ibnex", "ibnex_fill_nodeinfo: %s %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1667
	    IBNEX_NODE_OSTATE_NVL, state.ap_ostate);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1668
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1669
	if (nvlist_add_int32(*nvlpp, IBNEX_NODE_COND_NVL, state.ap_condition)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1670
		IBTF_DPRINTF_L2("ibnex", "ibnex_fill_nodeinfo: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1671
		    "failed to fill in %s", IBNEX_NODE_COND_NVL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1672
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1673
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1674
	IBTF_DPRINTF_L5("ibnex", "ibnex_fill_nodeinfo: %s %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
	    IBNEX_NODE_COND_NVL, state.ap_condition);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1676
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1677
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1678
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
 * ibnex_figure_ap_devstate()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
 *	Fills the "devctl_ap_state_t" for a given ap_id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
 *	currently it assumes that we don't support "error_code" and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
 *	"last_change" value.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1688
static void
12163
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
  1689
ibnex_figure_ap_devstate(ibnex_node_data_t *nodep, devctl_ap_state_t *ap_state)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1690
{
12163
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
  1691
	IBTF_DPRINTF_L5("ibnex", "ibnex_figure_ap_devstate: nodep = %p", nodep);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1692
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1693
	ap_state->ap_rstate = AP_RSTATE_CONNECTED;
12163
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
  1694
	if (nodep == NULL) {	/* for nodes not seen by IBNEX yet */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1695
		ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
		ap_state->ap_condition = AP_COND_UNKNOWN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
	} else {
12163
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
  1698
		/*
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
  1699
		 * IBNEX_NODE_AP_UNCONFIGURED & IBNEX_NODE_AP_CONFIGURING.
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
  1700
		 */
f0cf0084e756 PSARC 2010/085 IPoIB Administration Enhancement
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10183
diff changeset
  1701
		if (nodep->node_ap_state >= IBNEX_NODE_AP_UNCONFIGURED) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
			ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
			ap_state->ap_condition = AP_COND_UNKNOWN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
			ap_state->ap_ostate = AP_OSTATE_CONFIGURED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
			ap_state->ap_condition = AP_COND_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
	ap_state->ap_last_change = (time_t)-1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
	ap_state->ap_error_code = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
	ap_state->ap_in_transition = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1714
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
 * ibnex_figure_ib_apid_devstate()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
 *	Fills the "devctl_ap_state_t" for a IB static ap_id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
ibnex_figure_ib_apid_devstate(devctl_ap_state_t *ap_state)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
	ap_state->ap_rstate = AP_RSTATE_CONNECTED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
	ap_state->ap_condition = AP_COND_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
	ap_state->ap_ostate = (ibt_get_hca_list(NULL) == 0) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
	    AP_OSTATE_UNCONFIGURED : AP_OSTATE_CONFIGURED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
	ap_state->ap_last_change = (time_t)-1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
	ap_state->ap_error_code = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
	ap_state->ap_in_transition = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
 * ibnex_get_apid()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
 *	Reads in the ap_id passed as an nvlist_string from user-land
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
ibnex_get_apid(struct devctl_iocdata *dcp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
	char *ap_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
	ASSERT(mutex_owned(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1742
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1743
	/* Get which ap_id to operate on.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
	if (nvlist_lookup_string(ndi_dc_get_ap_data(dcp), "apid",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1745
	    &ap_id) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
		IBTF_DPRINTF_L4("ibnex", "ibnex_get_apid: ap_id lookup failed");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1747
		ap_id = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1748
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1749
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1750
	IBTF_DPRINTF_L4("ibnex", "ibnex_get_apid: ap_id=%s", ap_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1751
	return (ap_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1752
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1753
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1754
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1755
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1756
 * ibnex_get_dip_from_apid()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1757
 *	Figures out the dip/node_data from an ap_id given that this ap_id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1758
 *	exists as a "name" in the "ibnex" list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1759
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1760
 * NOTE: ap_id was on stack earlier and gets manipulated here. Since this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
 * function may be called twice; it is better to make a local copy of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
 * ap_id; if the ap_id were to be reused.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1763
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1764
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
ibnex_get_dip_from_apid(char *apid, dev_info_t **ret_dip,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1766
    ibnex_node_data_t **ret_node_datap)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1767
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1768
	int			rv, ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1769
	int			index;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1770
	int			len = strlen((char *)apid) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1771
	char			*dyn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1772
	char			*ap_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1773
	char			*first;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1774
	char			*second = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1775
	char			*node_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1776
	char			name[100];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1777
	ibnex_node_data_t	*nodep = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1778
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1779
	ap_id = i_ddi_strdup(apid, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1780
	IBTF_DPRINTF_L4("ibnex", "\tibnex_get_dip_from_apid: %s", ap_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1781
	ASSERT(mutex_owned(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1782
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
	if ((dyn = GET_DYN(ap_id)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
		rv = IBNEX_DYN_APID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
	} else {	/* either static, hca or unknown */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
		*ret_dip = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
		if (strstr(ap_id, "hca") != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
			rv = IBNEX_HCA_APID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
		} else if (strstr(ap_id, IBNEX_FABRIC) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
			rv = IBNEX_BASE_APID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
			rv = IBNEX_UNKNOWN_APID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1794
		kmem_free(ap_id, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
		return (rv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
	dyn += strlen(DYN_SEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
	if (*dyn == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
		*ret_dip = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1801
		kmem_free(ap_id, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
		return (IBNEX_UNKNOWN_APID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1804
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
	/* APID */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
	first = strchr(dyn, ',');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
	if (first != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
		second = strchr(first+1, ',');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
	/* Implies Port or VPPA or HCA_SVC Driver ap_id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
	if (first != NULL && second != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1812
		int	str_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1813
		int	pkey_val = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1814
		char	*pkey_str = strchr(ap_id, ',');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1815
		char	*svc_str = strrchr(pkey_str, ',');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1816
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
		/* dyn contains ,GUID,p_key,svc_name. Change it to GUID */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
		str_len = strlen(dyn) - strlen(pkey_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
		dyn[str_len] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
		IBTF_DPRINTF_L4("ibnex", "\tibnex_get_dip_from_apid: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
		    "Port / Node Guid %s", dyn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
		/* figure out comm or vppa. figure out pkey  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
		++pkey_str; /* pkey_str used to point to ",p_key,svc_name" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1825
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
		/* pkey_str contains p_key,svc_name. Change it to p_key */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
		str_len = strlen(pkey_str) - strlen(svc_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
		pkey_str[str_len] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1830
		/* convert the string P_KEY to hex value */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1831
		pkey_val = ibnex_str2hex(pkey_str, strlen(pkey_str), &ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
		if (ret != IBNEX_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
			*ret_dip = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
			kmem_free(ap_id, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
			return (IBNEX_UNKNOWN_APID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
		++svc_str;	/* svc_str used to point to ",svc_name" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
		IBTF_DPRINTF_L5("ibnex", "\tibnex_get_dip_from_apid: pkey %s"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
		    ":%x service name = %s", pkey_str, pkey_val, svc_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
		for (nodep = ibnex.ibnex_port_node_head;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
		    nodep != NULL; nodep = nodep->node_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
			index = nodep->node_data.port_node.port_commsvc_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
			IBNEX_FORM_GUID(name, IBTL_IBNEX_APID_LEN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
			    nodep->node_data.port_node.port_guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1847
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
			 * Match P_Key, name string & service string:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
			 * For COMM / HCA_SVC services these should be true:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
			 *	P_Key matches to 0, svc_str in comm_svc_names[]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
			 *	and name matches the dynamic part of the ap_id
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
			 * For VPPA services this should be true:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
			 *	P_Key != 0 & matches, svc_str in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
			 *	vppa_comm_svc_names[] and the name matches the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1856
			 *	dynamic part of the ap_id.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
			if ((pkey_val == nodep->node_data.port_node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
			    port_pkey) && (strstr(dyn, name) != NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
				/* pkey != 0, COMM / HCA_SVC service */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
				if (((pkey_val == 0) && (
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
					/* Port Service */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
				    ((ibnex.ibnex_comm_svc_names != NULL) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
				    (index < ibnex.ibnex_num_comm_svcs) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
				    (strstr(svc_str, ibnex.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
				    ibnex_comm_svc_names[index]) != NULL)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
					/* HCA_SVC service */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
				    ((ibnex.ibnex_hcasvc_comm_svc_names !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
				    NULL) && (index <
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1871
				    ibnex.ibnex_nhcasvc_comm_svcs) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1872
				    (strstr(svc_str, ibnex.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1873
				    ibnex_hcasvc_comm_svc_names[index])
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1874
				    != NULL)))) ||
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1875
					/* next the VPPA strings */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
				    ((pkey_val != 0) && (strstr(svc_str, ibnex.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877
				    ibnex_vppa_comm_svc_names[index]) !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
				    NULL))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
					if (nodep->node_dip)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
						ndi_hold_devi(nodep->node_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
					*ret_node_datap = nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1882
					*ret_dip = nodep->node_dip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1883
					kmem_free(ap_id, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1884
					return (rv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1885
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1886
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1887
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1888
		} /* end of for */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1889
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1890
	} else if (first != NULL && second == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1891
		/* pseudo ap_id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1892
		for (nodep = ibnex.ibnex_pseudo_node_head; nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
		    nodep = nodep->node_next) {
1093
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 0
diff changeset
  1894
			if (nodep->node_data.pseudo_node.pseudo_merge_node
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 0
diff changeset
  1895
			    == 1)
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 0
diff changeset
  1896
				continue;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1897
			node_addr = nodep->node_data.pseudo_node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1898
			    pseudo_node_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1899
			if (strncmp(dyn, node_addr, strlen(node_addr)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1900
				if (nodep->node_dip)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
					ndi_hold_devi(nodep->node_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
				*ret_node_datap = nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
				*ret_dip = nodep->node_dip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
				kmem_free(ap_id, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1905
				return (rv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1906
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1907
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1908
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1909
	} else if (first == NULL && second == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1910
		/* This is an IOC ap_id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1911
		for (nodep = ibnex.ibnex_ioc_node_head; nodep != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1912
		    nodep = nodep->node_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1913
			IBNEX_FORM_GUID(name, IBTL_IBNEX_APID_LEN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1914
			    nodep->node_data.ioc_node.ioc_guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1915
			if (strstr(dyn, name) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1916
				if (nodep->node_dip)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1917
					ndi_hold_devi(nodep->node_dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1918
				*ret_node_datap = nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1919
				*ret_dip = nodep->node_dip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1920
				kmem_free(ap_id, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1921
				return (rv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1922
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1923
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1924
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1925
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1926
	/* Could not find a matching IB device */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1927
	*ret_dip = (nodep) ? nodep->node_dip : NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1928
	kmem_free(ap_id, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1929
	return (rv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1930
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1931
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1932
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1933
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1934
 * ibnex_handle_pseudo_configure()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1935
 *	Do DEVCTL_AP_CONNECT processing for Pseudo devices only.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1936
 *	The code also checks if the given ap_id is valid or not.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1937
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1938
static ibnex_rval_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1939
ibnex_handle_pseudo_configure(char *apid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1940
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1941
	char			*node_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1942
	char			*last = strrchr(apid, ':') + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1943
	ibnex_rval_t		retval = IBNEX_FAILURE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1944
	ibnex_node_data_t	*nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1945
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1946
	IBTF_DPRINTF_L4("ibnex", "\tibnex_handle_pseudo_configure: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1947
	    "last = %s\n\t\tapid = %s", last, apid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1948
	ASSERT(MUTEX_HELD(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
	/* Check if the APID is valid first */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
	if (apid == NULL || last == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1952
		IBTF_DPRINTF_L4("ibnex", "\tibnex_handle_pseudo_configure: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1953
		    "invalid apid %s", apid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1954
		return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1955
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1956
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1957
	/* find the matching entry and configure it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
	for (nodep = ibnex.ibnex_pseudo_node_head; nodep != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1959
	    nodep = nodep->node_next) {
1093
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 0
diff changeset
  1960
		if (nodep->node_data.pseudo_node.pseudo_merge_node == 1)
4dc7aec69dc9 6299476 DM Does not interoperate with TS90 switch, cannot discover SRP targets
hiremath
parents: 0
diff changeset
  1961
			continue;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1962
		node_addr = nodep->node_data.pseudo_node.pseudo_node_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1963
		if (strncmp(node_addr, last, strlen(last)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1964
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1965
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1966
		if (nodep->node_dip != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1967
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1968
			 * Return BUSY if another configure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1969
			 * operation is in progress
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
			if (nodep->node_state ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
			    IBNEX_CFGADM_CONFIGURING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
				return (IBNEX_BUSY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
				return (IBNEX_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1976
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1977
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1979
		 * Return BUSY if another unconfigure operation is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
		 * in progress
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
		if (nodep->node_state == IBNEX_CFGADM_UNCONFIGURING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
			return (IBNEX_BUSY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
		ASSERT(nodep->node_state != IBNEX_CFGADM_CONFIGURED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
		nodep->node_state = IBNEX_CFGADM_CONFIGURING;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1987
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1988
		mutex_exit(&ibnex.ibnex_mutex);
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  1989
		retval = ibnex_pseudo_create_all_pi(nodep);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1990
		mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1991
		if (retval == NDI_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1992
			nodep->node_state = IBNEX_CFGADM_CONFIGURED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1993
			return (IBNEX_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1994
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1995
			nodep->node_state = IBNEX_CFGADM_UNCONFIGURED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1996
			return (IBNEX_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1997
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1998
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1999
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2000
	IBTF_DPRINTF_L4("ibnex", "\thandle_pseudo_configure: retval=%d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2001
	    retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2002
	return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2003
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2004
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2005
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2006
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2007
 * ibnex_handle_ioc_configure()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2008
 *	Do DEVCTL_AP_CONNECT processing for IOCs only.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2009
 *	The code also checks if the given ap_id is valid or not.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2010
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2011
static ibnex_rval_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2012
ibnex_handle_ioc_configure(char *apid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2013
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2014
	int			ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2015
	char			*guid_str = strrchr(apid, ':') + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2016
	ib_guid_t		ioc_guid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2017
	ibnex_rval_t		retval = IBNEX_FAILURE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2018
	ibdm_ioc_info_t		*ioc_info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2019
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2020
	ASSERT(MUTEX_HELD(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2021
	IBTF_DPRINTF_L4("ibnex", "\tibnex_handle_ioc_configure: %s", apid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2022
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2023
	/* Check if the APID is valid first */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2024
	if (guid_str == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2025
		IBTF_DPRINTF_L4("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2026
		    "\tibnex_handle_ioc_configure: invalid apid %s", apid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2027
		return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2028
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2029
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2030
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2031
	 * Call into IBDM to get IOC information
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2032
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2033
	ioc_guid = ibnex_str2hex(guid_str, strlen(guid_str), &ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2034
	if (ret != IBNEX_SUCCESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2035
		return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2036
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2037
	IBTF_DPRINTF_L4("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2038
	    "\tibnex_handle_ioc_configure: IOC GUID = %llX", ioc_guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2039
	mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2040
	ioc_info = ibdm_ibnex_get_ioc_info(ioc_guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2041
	mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2042
	if (ioc_info == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2043
		IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2044
		    "\tibnex_handle_ioc_configure: probe_iocguid failed");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2045
		return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2046
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2047
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  2048
	retval = ibnex_ioc_initnode_all_pi(ioc_info);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049
	ibdm_ibnex_free_ioc_list(ioc_info);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2051
	IBTF_DPRINTF_L4("ibnex", "\tibnex_handle_ioc_configure: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2052
	    "done retval = %d", retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2053
	return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2057
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2058
 * ibnex_handle_commsvcnode_configure()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2059
 *	Do DEVCTL_AP_CONNECT processing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2060
 *	This is done for Port/VPPA/HCA_SVC drivers Only.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2061
 *	The code also checks if the given ap_id is valid or not.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2062
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2063
static ibnex_rval_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
ibnex_handle_commsvcnode_configure(char *apid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2065
{
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  2066
	int			ret, str_len, circ;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
	int			sndx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
	int			port_pkey = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
	char			*pkey_str = strchr(apid, ',');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
	char			*guid_str = strrchr(apid, ':') + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
	char			*svc_str = strrchr(pkey_str, ',');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
	boolean_t		found = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2073
	boolean_t		is_hcasvc_node = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2074
	ib_guid_t		guid;	/* Port / Node GUID */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2075
	dev_info_t		*parent;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2076
	ibnex_rval_t		retval = IBNEX_FAILURE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2077
	ibdm_port_attr_t	*port_attr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2078
	int			node_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2079
	ibdm_hca_list_t		*hca_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2080
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2081
	ASSERT(MUTEX_HELD(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2082
	IBTF_DPRINTF_L4("ibnex", "\tibnex_handle_commsvcnode_configure: %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2083
	    apid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2084
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2085
	/* Check if the APID is valid first */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2086
	if (guid_str == NULL || ((guid_str != NULL) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2087
	    (pkey_str == NULL || svc_str == NULL))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2088
		IBTF_DPRINTF_L4("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2089
		    "\tibnex_handle_commsvcnode_configure: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2090
		    "invalid apid %s", apid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2091
		return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2092
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2093
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2094
	/* guid_str contains GUID,p_key,svc_name. Change it to GUID */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2095
	str_len = strlen(guid_str) - strlen(pkey_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2096
	guid_str[str_len] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2097
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2098
	/* convert the string GUID to hex value */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2099
	guid = ibnex_str2hex(guid_str, strlen(guid_str), &ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2100
	if (ret == IBNEX_FAILURE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2101
		return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2102
	IBTF_DPRINTF_L4("ibnex", "\tibnex_handle_commsvcnode_configure: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2103
	    "Port / Node Guid %llX", guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2105
	/* figure out Port/HCA_SVC or VPPA. Also figure out the P_Key.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2106
	++pkey_str;	/* pkey_str used to point to ",p_key,svc_name" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2108
	/* pkey_str contains p_key,svc_name. Change it to P_Key */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2109
	str_len = strlen(pkey_str) - strlen(svc_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2110
	pkey_str[str_len] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2111
	IBTF_DPRINTF_L5("ibnex", "\tibnex_handle_commsvcnode_configure: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2112
	    "p_key %s", pkey_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2113
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2114
	/* convert the string P_Key to a hexadecimal value */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2115
	port_pkey = ibnex_str2hex(pkey_str, strlen(pkey_str), &ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2116
	IBTF_DPRINTF_L5("ibnex", "\tibnex_handle_commsvcnode_configure: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2117
	    "PKEY num %x", port_pkey);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2118
	if (ret == IBNEX_FAILURE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2119
		return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2121
	++svc_str;	/* svc_str used to point to ",svc_name" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2123
	/* find the service index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2124
	if (port_pkey == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2125
		/* PORT Devices */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2126
		for (sndx = 0; sndx < ibnex.ibnex_num_comm_svcs; sndx++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2127
			if (strncmp(ibnex.ibnex_comm_svc_names[sndx],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2128
			    svc_str, strlen(svc_str)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2129
				found = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2130
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2131
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2132
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2134
		/* HCA_SVC Devices */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2135
		if (found == B_FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2136
			for (sndx = 0; sndx < ibnex.ibnex_nhcasvc_comm_svcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2137
			    sndx++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2138
				if (strncmp(ibnex.ibnex_hcasvc_comm_svc_names
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2139
				    [sndx], svc_str, strlen(svc_str)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2140
					found = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2141
					is_hcasvc_node = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2142
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2143
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2144
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2145
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2147
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2148
		for (sndx = 0; sndx < ibnex.ibnex_nvppa_comm_svcs; sndx++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2149
			if (strncmp(ibnex.ibnex_vppa_comm_svc_names[sndx],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2150
			    svc_str, strlen(svc_str)) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2151
				found = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2152
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2153
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2154
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2155
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2157
	if (found == B_FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2158
		IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2159
		    "\tibnex_handle_commsvcnode_configure: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2160
		    "invalid service %s", svc_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2161
		return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2162
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2164
	/* get Port attributes structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2165
	mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2166
	if (is_hcasvc_node == B_FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2167
		port_attr = ibdm_ibnex_get_port_attrs(guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2168
		if (port_attr == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2169
			IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2170
			    "\tibnex_handle_commsvcnode_configure: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2171
			    "ibdm_ibnex_get_port_attrs failed");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2172
			mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2173
			return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2174
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2175
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2176
		hca_list = ibdm_ibnex_get_hca_info_by_guid(guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2177
		if (hca_list == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2178
			IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2179
			    "\tibnex_handle_commsvcnode_configure: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2180
			    "ibdm_ibnex_get_hca_info_by_guid failed");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2181
			mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2182
			return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2183
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2184
		port_attr = hca_list->hl_hca_port_attr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2185
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2187
	/* get HCA's dip */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2188
	parent = ibtl_ibnex_hcaguid2dip(port_attr->pa_hca_guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2190
	if (parent == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2191
		IBTF_DPRINTF_L2("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2192
		    "\tibnex_handle_commsvcnode_configure: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2193
		    "no HCA present");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2194
		mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2195
		if (is_hcasvc_node == B_FALSE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2196
			ibdm_ibnex_free_port_attr(port_attr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2197
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2198
			ibdm_ibnex_free_hca_list(hca_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2199
		return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2200
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2202
	if (port_pkey == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2203
		node_type = (is_hcasvc_node == B_FALSE) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2204
		    IBNEX_PORT_COMMSVC_NODE : IBNEX_HCASVC_COMMSVC_NODE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2205
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2206
		node_type = IBNEX_VPPA_COMMSVC_NODE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2208
	mutex_enter(&ibnex.ibnex_mutex);
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  2209
	ndi_devi_enter(parent, &circ);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2210
	if (ibnex_commsvc_initnode(parent, port_attr, sndx, node_type,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2211
	    port_pkey, &ret, IBNEX_CFGADM_ENUMERATE) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2212
		retval = IBNEX_SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2213
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2214
		retval = (ret == IBNEX_BUSY) ? IBNEX_BUSY : IBNEX_FAILURE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2215
	}
8082
f52c9d98dc8c 6566278 Panic when ibd is configured after HCA is unconfigured and configured
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 4411
diff changeset
  2216
	ndi_devi_exit(parent, circ);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2218
	if (is_hcasvc_node == B_FALSE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2219
		ibdm_ibnex_free_port_attr(port_attr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2220
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2221
		ibdm_ibnex_free_hca_list(hca_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2222
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2223
	IBTF_DPRINTF_L4("ibnex", "\tibnex_handle_commsvcnode_configure: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2224
	    "done retval = %d", retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2226
	return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2227
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2230
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2231
 * ibnex_return_apid()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2232
 *	Construct the ap_id of a given IBTF client in kernel
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2233
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2234
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2235
ibnex_return_apid(dev_info_t *childp, char **ret_apid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2236
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2237
	ibnex_node_data_t	*nodep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2239
	IBTF_DPRINTF_L4("ibnex", "ibnex_return_apid:");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2240
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2241
	ASSERT(childp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2242
	nodep = ddi_get_parent_data(childp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2244
	if (nodep->node_type == IBNEX_PORT_COMMSVC_NODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2245
		(void) snprintf(*ret_apid, IBTL_IBNEX_APID_LEN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2246
		    "ib%s%llX,0,%s", DYN_SEP,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2247
		    (longlong_t)nodep->node_data.port_node.port_guid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2248
		    ibnex.ibnex_comm_svc_names[nodep->node_data.port_node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2249
		    port_commsvc_idx]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2250
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2251
	} else if (nodep->node_type == IBNEX_HCASVC_COMMSVC_NODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2252
		(void) snprintf(*ret_apid, IBTL_IBNEX_APID_LEN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2253
		    "ib%s%llX,0,%s", DYN_SEP,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2254
		    (longlong_t)nodep->node_data.port_node.port_guid, ibnex.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2255
		    ibnex_hcasvc_comm_svc_names[nodep->node_data.port_node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2256
		    port_commsvc_idx]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2257
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2258
	} else if (nodep->node_type == IBNEX_VPPA_COMMSVC_NODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2259
		(void) snprintf(*ret_apid, IBTL_IBNEX_APID_LEN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2260
		    "ib%s%llX,%x,%s", DYN_SEP,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2261
		    (longlong_t)nodep->node_data.port_node.port_guid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2262
		    nodep->node_data.port_node.port_pkey,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2263
		    ibnex.ibnex_vppa_comm_svc_names[nodep->node_data.port_node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2264
		    port_commsvc_idx]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2266
	} else if (nodep->node_type == IBNEX_IOC_NODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2267
		(void) snprintf(*ret_apid, IBTL_IBNEX_APID_LEN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2268
		    "ib%s%llX", DYN_SEP,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2269
		    (longlong_t)nodep->node_data.ioc_node.ioc_guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2270
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2271
	} else if (nodep->node_type == IBNEX_PSEUDO_NODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2272
		(void) snprintf(*ret_apid, IBTL_IBNEX_APID_LEN, "ib%s%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2273
		    DYN_SEP, nodep->node_data.pseudo_node.pseudo_node_addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2275
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2276
		(void) snprintf(*ret_apid, IBTL_IBNEX_APID_LEN, "%s", "-");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2277
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2279
	IBTF_DPRINTF_L4("ibnex", "ibnex_return_apid: %x %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2280
	    nodep->node_type, ret_apid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2281
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2284
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2285
 * ibnex_vppa_conf_entry_add()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2286
 *	Add a new service to the ibnex data base of VPPA communication
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2287
 *	services.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2288
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2289
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2290
ibnex_vppa_conf_entry_add(char *service)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2291
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2292
	int	i, nsvcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2293
	char	**service_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2294
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2295
	ASSERT(MUTEX_HELD(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2296
	nsvcs = ibnex.ibnex_nvppa_comm_svcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2297
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2298
	/* Allocate space for new "ibnex.ibnex_nvppa_comm_svcs + 1" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2299
	service_name = kmem_alloc((nsvcs + 1) * sizeof (char *), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2300
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2301
	 * Copy over the existing "ibnex.ibnex_vppa_comm_svc_names"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2302
	 * array. Add the new service at the end.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2303
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2304
	for (i = 0; i < nsvcs; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2305
		service_name[i] = ibnex.ibnex_vppa_comm_svc_names[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2306
	service_name[i] = kmem_alloc(strlen(service) + 1, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2307
	(void) snprintf(service_name[i], 5, "%s", service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2309
	/* Replace existing pointer to VPPA services w/ newly allocated one */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2310
	if (ibnex.ibnex_vppa_comm_svc_names) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2311
		kmem_free(ibnex.ibnex_vppa_comm_svc_names, nsvcs *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2312
		    sizeof (char *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2313
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2314
	ibnex.ibnex_nvppa_comm_svcs++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2315
	ibnex.ibnex_vppa_comm_svc_names = service_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2316
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2317
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2318
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2319
 * ibnex_port_conf_entry_add()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2320
 *	Add a new service to the ibnex data base of Port communication
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2321
 *	services.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2322
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2323
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2324
ibnex_port_conf_entry_add(char *service)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2325
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2326
	int	i, nsvcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2327
	char	**service_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2328
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2329
	ASSERT(MUTEX_HELD(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2330
	nsvcs = ibnex.ibnex_num_comm_svcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2332
	/* Allocate space for new "ibnex.ibnex_num_comm_svcs + 1" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2333
	service_name = kmem_alloc((nsvcs + 1) * sizeof (char *), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2334
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2335
	 * Copy over the existing "ibnex.ibnex_comm_svc_names" array.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2336
	 * Add the new service to the end.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2337
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2338
	for (i = 0; i < nsvcs; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2339
		service_name[i] = ibnex.ibnex_comm_svc_names[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2340
	service_name[i] = kmem_alloc(strlen(service) + 1, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2341
	(void) snprintf(service_name[i], 5, "%s", service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2342
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2343
	/* Replace existing pointer to Port services w/ newly allocated one */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2344
	if (ibnex.ibnex_comm_svc_names) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2345
		kmem_free(ibnex.ibnex_comm_svc_names, nsvcs * sizeof (char *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2346
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2347
	ibnex.ibnex_num_comm_svcs++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2348
	ibnex.ibnex_comm_svc_names = service_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2349
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2350
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2351
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2352
 * ibnex_hcasvc_conf_entry_add()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2353
 *	Add a new service to the ibnex data base of HCA_SVC communication
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2354
 *	services.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2355
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2356
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2357
ibnex_hcasvc_conf_entry_add(char *service)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2358
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2359
	int	i, nsvcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2360
	char	**service_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2362
	ASSERT(MUTEX_HELD(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2363
	nsvcs = ibnex.ibnex_nhcasvc_comm_svcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2365
	/* Allocate space for new "ibnex.ibnex_nvppa_comm_svcs + 1" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2366
	service_name = kmem_alloc((nsvcs + 1) * sizeof (char *), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2367
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2368
	 * Copy over the existing "ibnex.ibnex_hcasvc_comm_svc_names"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2369
	 * array. Add the new service at the end.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2370
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2371
	for (i = 0; i < nsvcs; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2372
		service_name[i] = ibnex.ibnex_hcasvc_comm_svc_names[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2373
	service_name[i] = kmem_alloc(strlen(service) + 1, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2374
	(void) snprintf(service_name[i], 5, "%s", service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2375
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2376
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2377
	 * Replace existing pointer to HCA_SVC services w/ newly
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2378
	 * allocated one
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2379
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2380
	if (ibnex.ibnex_hcasvc_comm_svc_names) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2381
		kmem_free(ibnex.ibnex_hcasvc_comm_svc_names, nsvcs *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2382
		    sizeof (char *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2383
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2384
	ibnex.ibnex_nhcasvc_comm_svcs++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2385
	ibnex.ibnex_hcasvc_comm_svc_names = service_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2386
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2389
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2390
 * ibnex_vppa_conf_entry_delete()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2391
 *	Delete an existing service entry from ibnex data base of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2392
 *	VPPA communication services.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2393
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2394
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2395
ibnex_vppa_conf_entry_delete(char *msg, char *service)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2396
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2397
	int			i, j, nsvcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2398
	int			len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2399
	int			match_ndx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2400
	char			**service_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2401
	boolean_t		found = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2402
	ibnex_node_data_t	*node_datap = ibnex.ibnex_port_node_head;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2403
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2404
	IBTF_DPRINTF_L4("ibnex", "\tvppa_conf_entry_delete: %s", service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2405
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2406
	ASSERT(MUTEX_HELD(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2407
	nsvcs = ibnex.ibnex_nvppa_comm_svcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2408
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2409
	/* find matching index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2410
	for (i = 0; i < nsvcs; i++) {
9713
7146b58ba290 6842334 "cfgadm -o comm=port,service=new -x delete_service ib" corrupt /kernel/drv/ib.conf
Bill Taylor <Bill.Taylor@Sun.COM>
parents: 8082
diff changeset
  2411
		if (strcmp(ibnex.ibnex_vppa_comm_svc_names[i], service))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2412
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2413
		found = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2414
		match_ndx = i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2415
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2416
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2417
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2418
	/* check for valid "nsvcs" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2419
	if (found == B_FALSE || nsvcs == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2420
		IBTF_DPRINTF_L2("ibnex", "%s: invalid vppa services %x",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2421
		    msg, nsvcs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2422
		return (EIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2423
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2424
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2425
	/* Check if service is in use; return failure if so */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2426
	for (; node_datap; node_datap = node_datap->node_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2427
		if ((node_datap->node_data.port_node.port_commsvc_idx == i) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2428
		    node_datap->node_type == IBNEX_VPPA_COMMSVC_NODE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2429
		    node_datap->node_dip) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2430
			IBTF_DPRINTF_L2("ibnex", "%s: service %s is in use",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2431
			    msg, service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2432
			return (EIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2433
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2434
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2436
	/* if nsvcs == 1, bailout early */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2437
	if (nsvcs == 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2438
		/* free up that single entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2439
		len = strlen(ibnex.ibnex_vppa_comm_svc_names[0]) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2440
		kmem_free(ibnex.ibnex_vppa_comm_svc_names[0], len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2441
		kmem_free(ibnex.ibnex_vppa_comm_svc_names, sizeof (char *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2442
		ibnex.ibnex_vppa_comm_svc_names = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2443
		ibnex.ibnex_nvppa_comm_svcs = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2444
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2445
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2446
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2447
	/* Allocate space for new "ibnex.ibnex_nvppa_comm_svcs - 1" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2448
	service_name = kmem_alloc((nsvcs - 1) * sizeof (char *), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2449
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2450
	 * Copy over the existing "ibnex.ibnex_vppa_comm_svc_names"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2451
	 * array. Do not copy over the matching service.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2452
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2453
	for (i = 0, j = 0; i < nsvcs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2454
		if (i == match_ndx) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2455
			/* free up that entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2456
			len = strlen(ibnex.ibnex_vppa_comm_svc_names[i]) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2457
			kmem_free(ibnex.ibnex_vppa_comm_svc_names[i], len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2458
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2459
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2460
		service_name[j++] = ibnex.ibnex_vppa_comm_svc_names[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2461
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2462
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2463
	/* Replace existing pointer to VPPA services w/ newly adjusted one */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2464
	if (ibnex.ibnex_vppa_comm_svc_names) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2465
		kmem_free(ibnex.ibnex_vppa_comm_svc_names, nsvcs *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2466
		    sizeof (char *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2467
		ibnex.ibnex_nvppa_comm_svcs--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2468
		ibnex.ibnex_vppa_comm_svc_names = service_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2469
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2470
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2471
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2473
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2474
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2475
 * ibnex_port_conf_entry_delete()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2476
 *	Delete an existing service entry from ibnex data base of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2477
 *	Port communication services.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2478
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2479
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2480
ibnex_port_conf_entry_delete(char *msg, char *service)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2481
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2482
	int			i, j, nsvcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2483
	int			match_ndx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2484
	int			len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2485
	char			**service_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2486
	boolean_t		found = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2487
	ibnex_node_data_t	*node_datap = ibnex.ibnex_port_node_head;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2488
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2489
	IBTF_DPRINTF_L4("ibnex", "\tport_conf_entry_delete: %s", service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2490
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2491
	ASSERT(MUTEX_HELD(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2492
	nsvcs = ibnex.ibnex_num_comm_svcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2494
	/* find matching index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2495
	for (i = 0; i < nsvcs; i++) {
9713
7146b58ba290 6842334 "cfgadm -o comm=port,service=new -x delete_service ib" corrupt /kernel/drv/ib.conf
Bill Taylor <Bill.Taylor@Sun.COM>
parents: 8082
diff changeset
  2496
		if (strcmp(ibnex.ibnex_comm_svc_names[i], service))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2497
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2498
		found = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2499
		match_ndx = i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2500
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2501
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2502
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2503
	/* check for valid "nsvcs" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2504
	if (found == B_FALSE || nsvcs == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2505
		IBTF_DPRINTF_L2("ibnex", "%s: invalid services %x", msg, nsvcs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2506
		return (EIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2507
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2509
	/* Check if service is in use; return failure if so */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2510
	for (; node_datap; node_datap = node_datap->node_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2511
		if ((node_datap->node_data.port_node.port_commsvc_idx == i) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2512
		    node_datap->node_type == IBNEX_PORT_COMMSVC_NODE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2513
		    node_datap->node_dip)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2514
			return (EIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2515
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2517
	/* if nsvcs == 1, bailout early */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2518
	if (nsvcs == 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2519
		/* free up that single entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2520
		len = strlen(ibnex.ibnex_comm_svc_names[0]) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2521
		kmem_free(ibnex.ibnex_comm_svc_names[0], len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2522
		kmem_free(ibnex.ibnex_comm_svc_names, sizeof (char *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2523
		ibnex.ibnex_comm_svc_names = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2524
		ibnex.ibnex_num_comm_svcs = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2525
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2526
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2527
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2528
	/* Allocate space for new "ibnex.ibnex_num_comm_svcs - 1" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2529
	service_name = kmem_alloc((nsvcs - 1) * sizeof (char *), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2530
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2531
	 * Copy over the existing "ibnex.ibnex_comm_svc_names" array.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2532
	 * Skip the matching service.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2533
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2534
	for (i = 0, j = 0; i < nsvcs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2535
		if (i == match_ndx) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2536
			/* free up that entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2537
			len = strlen(ibnex.ibnex_comm_svc_names[i]) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2538
			kmem_free(ibnex.ibnex_comm_svc_names[i], len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2539
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2540
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2541
		service_name[j++] = ibnex.ibnex_comm_svc_names[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2542
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2543
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2544
	/* Replace existing pointer to Port services w/ newly adjusted one */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2545
	if (ibnex.ibnex_comm_svc_names) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2546
		kmem_free(ibnex.ibnex_comm_svc_names, nsvcs * sizeof (char *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2547
		ibnex.ibnex_num_comm_svcs--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2548
		ibnex.ibnex_comm_svc_names = service_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2549
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2550
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2551
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2552
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2553
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2554
 * ibnex_hcasvc_conf_entry_delete()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2555
 *	Delete an existing service entry from ibnex data base of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2556
 *	HCA_SVC communication services.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2557
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2558
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2559
ibnex_hcasvc_conf_entry_delete(char *msg, char *service)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2560
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2561
	int			i, j, nsvcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2562
	int			len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2563
	int			match_ndx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2564
	char			**service_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2565
	boolean_t		found = B_FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2566
	ibnex_node_data_t	*node_datap = ibnex.ibnex_port_node_head;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2568
	IBTF_DPRINTF_L4("ibnex", "\thcasvc_conf_entry_delete: %s", service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2569
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2570
	ASSERT(MUTEX_HELD(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2571
	nsvcs = ibnex.ibnex_nhcasvc_comm_svcs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2572
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2573
	/* find matching index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2574
	for (i = 0; i < nsvcs; i++) {
9713
7146b58ba290 6842334 "cfgadm -o comm=port,service=new -x delete_service ib" corrupt /kernel/drv/ib.conf
Bill Taylor <Bill.Taylor@Sun.COM>
parents: 8082
diff changeset
  2575
		if (strcmp(ibnex.ibnex_hcasvc_comm_svc_names[i], service))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2576
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2577
		found = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2578
		match_ndx = i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2579
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2580
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2582
	/* check for valid "nsvcs" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2583
	if (found == B_FALSE || nsvcs == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2584
		IBTF_DPRINTF_L2("ibnex", "%s: invalid hca_svc services %x",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2585
		    msg, nsvcs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2586
		return (EIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2587
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2588
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2589
	/* Check if service is in use; return failure if so */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2590
	for (; node_datap; node_datap = node_datap->node_next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2591
		if ((node_datap->node_data.port_node.port_commsvc_idx == i) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2592
		    node_datap->node_type == IBNEX_HCASVC_COMMSVC_NODE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2593
		    node_datap->node_dip) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2594
			IBTF_DPRINTF_L2("ibnex", "%s: service %s is in use",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2595
			    msg, service);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2596
			return (EIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2597
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2598
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2599
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2600
	/* if nsvcs == 1, bailout early */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2601
	if (nsvcs == 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2602
		/* free up that single entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2603
		len = strlen(ibnex.ibnex_hcasvc_comm_svc_names[0]) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2604
		kmem_free(ibnex.ibnex_hcasvc_comm_svc_names[0], len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2605
		kmem_free(ibnex.ibnex_hcasvc_comm_svc_names, sizeof (char *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2606
		ibnex.ibnex_hcasvc_comm_svc_names = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2607
		ibnex.ibnex_nhcasvc_comm_svcs = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2608
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2609
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2610
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2611
	/* Allocate space for new "ibnex.ibnex_nhcasvc_comm_svcs - 1" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2612
	service_name = kmem_alloc((nsvcs - 1) * sizeof (char *), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2613
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2614
	 * Copy over the existing "ibnex.ibnex_hcasvc_comm_svc_names"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2615
	 * array. Do not copy over the matching service.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2616
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2617
	for (i = 0, j = 0; i < nsvcs; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2618
		if (i == match_ndx) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2619
			/* free up that entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2620
			len = strlen(ibnex.ibnex_hcasvc_comm_svc_names[i]) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2621
			kmem_free(ibnex.ibnex_hcasvc_comm_svc_names[i], len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2622
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2623
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2624
		service_name[j++] = ibnex.ibnex_hcasvc_comm_svc_names[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2625
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2626
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2627
	/* Replace existing pointer to VPPA services w/ newly adjusted one */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2628
	if (ibnex.ibnex_hcasvc_comm_svc_names) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2629
		kmem_free(ibnex.ibnex_hcasvc_comm_svc_names, nsvcs *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2630
		    sizeof (char *));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2631
		ibnex.ibnex_nhcasvc_comm_svcs--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2632
		ibnex.ibnex_hcasvc_comm_svc_names = service_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2633
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2634
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2635
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2636
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2637
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2638
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2639
 * ibnex_ioc_fininode()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2640
 *	Un-initialize a child device node for IOC device node
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2641
 *	Returns IBNEX_SUCCESS/IBNEX_FAILURE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2642
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2643
static ibnex_rval_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2644
ibnex_ioc_fininode(dev_info_t *dip, ibnex_ioc_node_t *ioc_nodep)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2645
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2646
	int	rval = MDI_SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2647
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2648
	ASSERT(MUTEX_HELD(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2649
	IBTF_DPRINTF_L4("ibnex", "\tioc_fininode");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2650
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2651
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2652
	 * For a dis-connected IOC,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2653
	 *	Free the ioc_profile &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2654
	 *	decrement ibnex_num_disconnect_iocs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2655
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2656
	if (ioc_nodep->ioc_ngids == 0 && ioc_nodep->ioc_profile) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2657
		IBTF_DPRINTF_L4("ibnex", "\tioc_fininode: unconfigure "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2658
		    "disconnected IOC: GUID %lX", ioc_nodep->ioc_guid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2659
		ibnex.ibnex_num_disconnect_iocs--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2660
		kmem_free(ioc_nodep->ioc_profile,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2661
		    sizeof (ib_dm_ioc_ctrl_profile_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2662
		ioc_nodep->ioc_profile = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2663
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2665
	mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2666
	ASSERT(i_ddi_node_state(dip) >= DS_BOUND);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2667
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2668
	IBTF_DPRINTF_L4("ibnex", "\tioc_fininode: offlining the IOC");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2669
	rval = ibnex_offline_childdip(dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2670
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2671
	if (rval != MDI_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2672
		rval = NDI_FAILURE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2673
		IBTF_DPRINTF_L2("ibnex", "\toffline failed for IOC "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2674
		    "dip %p with 0x%x", dip, rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2675
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2676
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2677
	mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2678
	return (rval == MDI_SUCCESS ? IBNEX_SUCCESS : IBNEX_OFFLINE_FAILED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2679
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2680
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2681
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2682
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2683
ibnex_offline_childdip(dev_info_t *dip)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2684
{
9778
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2685
	int		rval = MDI_SUCCESS, rval2;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2686
	mdi_pathinfo_t	*path = NULL, *temp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2687
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2688
	IBTF_DPRINTF_L4("ibnex", "\toffline_childdip; begin");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2689
	if (dip == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2690
		IBTF_DPRINTF_L2("ibnex", "\toffline_childdip; NULL dip");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2691
		return (MDI_FAILURE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2692
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2693
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2694
	for (path = mdi_get_next_phci_path(dip, path); path; ) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2695
		IBTF_DPRINTF_L4("ibnex", "\toffline_childdip: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2696
		    "offling path %p", path);
9778
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2697
		rval2 = MDI_SUCCESS;
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2698
		if (MDI_PI_IS_ONLINE(path)) {
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2699
			rval2 = mdi_pi_offline(path, NDI_UNCONFIG);
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2700
			/* If it cannot be offlined, log this path and error */
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2701
			if (rval2 != MDI_SUCCESS) {
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2702
				rval = rval2;
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2703
				cmn_err(CE_WARN,
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2704
				    "!ibnex\toffline_childdip (0x%p): "
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2705
				    "mdi_pi_offline path (0x%p) failed with %d",
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2706
				    (void *)dip, (void *)path, rval2);
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2707
			}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2708
		}
9778
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2709
		/* prepare the next path */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2710
		temp = path;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2711
		path = mdi_get_next_phci_path(dip, path);
9778
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2712
		/* free the offline path */
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2713
		if (rval2 == MDI_SUCCESS) {
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2714
			(void) mdi_pi_free(temp, 0);
b37383aad21a 6728711 ibnex_ioc_create_pi() and ibnex_pseudo_create_pi() shouldn't call mdi_pi_offline() in error cases
Eiji Ota <Eiji.Ota@Sun.COM>
parents: 9713
diff changeset
  2715
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2716
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2717
	return (rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2718
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2719
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2720
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2721
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2722
 * ibnex_commsvc_fininode()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2723
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2724
 * Un-initialize a child device node for HCA port / node GUID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2725
 * for a communication service.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2726
 *	Returns IBNEX_SUCCESS/IBNEX_FAILURE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2727
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2728
static ibnex_rval_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2729
ibnex_commsvc_fininode(dev_info_t *dip)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2730
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2731
	int	rval = NDI_SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2733
	ASSERT(MUTEX_HELD(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2734
	IBTF_DPRINTF_L4("ibnex", "\tcommsvc_fininode");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2735
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2736
	mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2737
	if (i_ddi_node_state(dip) < DS_BOUND) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2738
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2739
		 * if the child hasn't been bound yet, we can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2740
		 * just free the dip. This path is currently
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2741
		 * untested.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2742
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2743
		(void) ddi_remove_child(dip, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2744
		IBTF_DPRINTF_L4("ibnex",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2745
		    "\tcommsvc_fininode: ddi_remove_child");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2746
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2747
		IBTF_DPRINTF_L4("ibnex", "\tcommsvc_fininode: offlining the "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2748
		    "Commsvc node");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2749
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2750
		rval = ndi_devi_offline(dip, NDI_DEVI_REMOVE | NDI_UNCONFIG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2751
		if (rval != NDI_SUCCESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2752
			IBTF_DPRINTF_L2("ibnex", "\toffline failed for Commsvc "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2753
			    "dip %p with 0x%x", dip, rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2754
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2755
	mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2756
	return (rval == NDI_SUCCESS ? IBNEX_SUCCESS : IBNEX_OFFLINE_FAILED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2757
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2758
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2759
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2760
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2761
 * ibnex_pseudo_fininode()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2762
 *	Un-initialize a child pseudo device node
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2763
 *	Returns IBNEX_SUCCESS/IBNEX_FAILURE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2764
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2765
static ibnex_rval_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2766
ibnex_pseudo_fininode(dev_info_t *dip)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2767
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2768
	int	rval = MDI_SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2769
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2770
	ASSERT(MUTEX_HELD(&ibnex.ibnex_mutex));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2771
	IBTF_DPRINTF_L4("ibnex", "\tpseudo_fininode: dip = %p", dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2772
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2773
	mutex_exit(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2774
	ASSERT(i_ddi_node_state(dip) >= DS_BOUND);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2775
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2776
	IBTF_DPRINTF_L4("ibnex", "\tpseudo_fininode: offlining the "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2777
	    "pseudo device");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2778
	rval = ibnex_offline_childdip(dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2779
	if (rval != MDI_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2780
		rval = NDI_FAILURE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2781
		IBTF_DPRINTF_L2("ibnex", "\tpseudo offline failed for "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2782
		    "dip %p with 0x%x", dip, rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2783
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2784
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2785
	mutex_enter(&ibnex.ibnex_mutex);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2786
	return (rval == MDI_SUCCESS ? IBNEX_SUCCESS : IBNEX_OFFLINE_FAILED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2787
}
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2788
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2789
/*
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2790
 * IOCTL implementation to get api version number.
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2791
 */
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2792
static int
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2793
ibnex_ctl_get_api_ver(dev_t dev, int cmd, intptr_t arg, int mode,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2794
    cred_t *credp, int *rvalp)
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2795
{
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2796
	ibnex_ctl_api_ver_t	api_ver;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2797
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2798
	IBTF_DPRINTF_L4("ibnex", "\tctl_get_api_ver: cmd=%x, arg=%p, "
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2799
	    "mode=%x, cred=%p, rval=%p, dev=0x%x", cmd, arg, mode, credp,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2800
	    rvalp, dev);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2801
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2802
	api_ver.api_ver_num = IBNEX_CTL_API_VERSION;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2803
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2804
	if (ddi_copyout(&api_ver, (void *)arg, sizeof (ibnex_ctl_api_ver_t),
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2805
	    mode) != 0) {
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2806
		IBTF_DPRINTF_L2("ibnex",
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2807
		    "\tctl_get_api_ver: ddi_copyout err");
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2808
		return (EFAULT);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2809
	}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2810
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2811
	return (0);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2812
}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2813
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2814
/*
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2815
 * IOCTL implementation to get the list of HCAs
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2816
 */
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2817
static int
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2818
ibnex_ctl_get_hca_list(dev_t dev, int cmd, intptr_t arg, int mode,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2819
    cred_t *credp, int *rvalp)
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2820
{
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2821
	ibnex_ctl_get_hca_list_t hca_list;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2822
	int		rv = 0;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2823
	uint_t		*in_nhcasp;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2824
	uint_t		nhcas, n;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2825
	ib_guid_t	*hca_guids;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2826
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2827
	IBTF_DPRINTF_L4("ibnex", "\tctl_get_hca_list: cmd=%x, arg=%p, "
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2828
	    "mode=%x, cred=%p, rval=%p, dev=0x%x", cmd, arg, mode, credp,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2829
	    rvalp, dev);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2830
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2831
#ifdef	_MULTI_DATAMODEL
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2832
	if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2833
		ibnex_ctl_get_hca_list_32_t hca_list_32;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2834
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2835
		if (ddi_copyin((void *)arg, &hca_list_32,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2836
		    sizeof (ibnex_ctl_get_hca_list_32_t), mode) != 0) {
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2837
			IBTF_DPRINTF_L2("ibnex",
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2838
			    "\tctl_get_hca_list: ddi_copyin err 1");
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2839
			return (EFAULT);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2840
		}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2841
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2842
		hca_list.hca_guids_alloc_sz = hca_list_32.hca_guids_alloc_sz;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2843
		hca_list.hca_guids =
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2844
		    (ib_guid_t *)(uintptr_t)hca_list_32.hca_guids;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2845
		in_nhcasp = &((ibnex_ctl_get_hca_list_32_t *)arg)->nhcas;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2846
	} else
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2847
#endif
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2848
	{
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2849
		if (ddi_copyin((void *)arg, &hca_list,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2850
		    sizeof (ibnex_ctl_get_hca_list_t), mode) != 0) {
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2851
			IBTF_DPRINTF_L2("ibnex",
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2852
			    "\tctl_get_hca_list: ddi_copyin err 2");
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2853
			return (EFAULT);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2854
		}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2855
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2856
		in_nhcasp = &((ibnex_ctl_get_hca_list_t *)arg)->nhcas;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2857
	}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2858
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2859
	nhcas = ibt_get_hca_list(&hca_guids);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2860
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2861
	/* copy number of hcas to user space */
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2862
	if (ddi_copyout(&nhcas, in_nhcasp, sizeof (uint_t), mode) != 0) {
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2863
		IBTF_DPRINTF_L2("ibnex",
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2864
		    "\tctl_get_hca_list: ddi_copyout err 1");
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2865
		rv = EFAULT;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2866
		goto out;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2867
	}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2868
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2869
	n = MIN(nhcas, hca_list.hca_guids_alloc_sz);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2870
	if (n == 0)
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2871
		goto out;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2872
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2873
	/* copy HCA guids to user space */
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2874
	if (ddi_copyout(hca_guids, hca_list.hca_guids,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2875
	    n * sizeof (ib_guid_t), mode) != 0) {
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2876
		IBTF_DPRINTF_L2("ibnex",
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2877
		    "\tctl_get_hca_list: ddi_copyout err 2");
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2878
		rv = EFAULT;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2879
	}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2880
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2881
out:
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2882
	if (nhcas > 0)
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2883
		ibt_free_hca_list(hca_guids, nhcas);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2884
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2885
	return (rv);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2886
}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2887
10094
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2888
#define	IBNEX_CTL_CP_HCA_INFO(x, y, driver_name, instance, device_path, \
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2889
    device_path_alloc_sz, device_path_len)				\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2890
{									\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2891
	(x)->hca_node_guid		= (y)->hca_node_guid;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2892
	(x)->hca_si_guid		= (y)->hca_si_guid;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2893
	(x)->hca_nports			= (y)->hca_nports;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2894
	(x)->hca_flags			= (y)->hca_flags;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2895
	(x)->hca_flags2			= (y)->hca_flags2;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2896
	(x)->hca_vendor_id		= (y)->hca_vendor_id;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2897
	(x)->hca_device_id		= (y)->hca_device_id;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2898
	(x)->hca_version_id		= (y)->hca_version_id;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2899
	(x)->hca_max_chans		= (y)->hca_max_chans;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2900
	(x)->hca_max_chan_sz		= (y)->hca_max_chan_sz;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2901
	(x)->hca_max_sgl		= (y)->hca_max_sgl;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2902
	(x)->hca_max_cq			= (y)->hca_max_cq;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2903
	(x)->hca_max_cq_sz		= (y)->hca_max_cq_sz;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2904
	(x)->hca_page_sz		= (y)->hca_page_sz;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2905
	(x)->hca_max_memr		= (y)->hca_max_memr;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2906
	(x)->hca_max_memr_len		= (y)->hca_max_memr_len;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2907
	(x)->hca_max_mem_win		= (y)->hca_max_mem_win;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2908
	(x)->hca_max_rsc		= (y)->hca_max_rsc;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2909
	(x)->hca_max_rdma_in_chan	= (y)->hca_max_rdma_in_chan;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2910
	(x)->hca_max_rdma_out_chan	= (y)->hca_max_rdma_out_chan;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2911
	(x)->hca_max_ipv6_chan		= (y)->hca_max_ipv6_chan;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2912
	(x)->hca_max_ether_chan 	= (y)->hca_max_ether_chan;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2913
	(x)->hca_max_mcg_chans		= (y)->hca_max_mcg_chans;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2914
	(x)->hca_max_mcg		= (y)->hca_max_mcg;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2915
	(x)->hca_max_chan_per_mcg	= (y)->hca_max_chan_per_mcg;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2916
	(x)->hca_max_partitions		= (y)->hca_max_partitions;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2917
	(x)->hca_local_ack_delay	= (y)->hca_local_ack_delay;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2918
	(x)->hca_max_port_sgid_tbl_sz	= (y)->hca_max_port_sgid_tbl_sz; \
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2919
	(x)->hca_max_port_pkey_tbl_sz	= (y)->hca_max_port_pkey_tbl_sz; \
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2920
	(x)->hca_max_pd			= (y)->hca_max_pd;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2921
	(x)->hca_max_ud_dest		= (y)->hca_max_ud_dest;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2922
	(x)->hca_max_srqs		= (y)->hca_max_srqs;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2923
	(x)->hca_max_srqs_sz		= (y)->hca_max_srqs_sz;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2924
	(x)->hca_max_srq_sgl		= (y)->hca_max_srq_sgl;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2925
	(x)->hca_max_cq_handlers	= (y)->hca_max_cq_handlers;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2926
	(x)->hca_reserved_lkey		= (y)->hca_reserved_lkey;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2927
	(x)->hca_max_fmrs		= (y)->hca_max_fmrs;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2928
	(x)->hca_max_lso_size		= (y)->hca_max_lso_size;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2929
	(x)->hca_max_lso_hdr_size	= (y)->hca_max_lso_hdr_size;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2930
	(x)->hca_max_inline_size	= (y)->hca_max_inline_size;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2931
	(x)->hca_max_cq_mod_count	= (y)->hca_max_cq_mod_count;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2932
	(x)->hca_max_cq_mod_usec	= (y)->hca_max_cq_mod_usec;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2933
	(x)->hca_fw_major_version	= (y)->hca_fw_major_version;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2934
	(x)->hca_fw_minor_version	= (y)->hca_fw_minor_version;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2935
	(x)->hca_fw_micro_version	= (y)->hca_fw_micro_version;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2936
	(x)->hca_ud_send_inline_sz	= (y)->hca_ud_send_inline_sz;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2937
	(x)->hca_conn_send_inline_sz	= (y)->hca_conn_send_inline_sz;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2938
	(x)->hca_conn_rdmaw_inline_overhead =				\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2939
	    (y)->hca_conn_rdmaw_inline_overhead;			\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2940
	(x)->hca_recv_sgl_sz		= (y)->hca_recv_sgl_sz;		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2941
	(x)->hca_ud_send_sgl_sz		= (y)->hca_ud_send_sgl_sz;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2942
	(x)->hca_conn_send_sgl_sz	= (y)->hca_conn_send_sgl_sz;	\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2943
	(x)->hca_conn_rdma_sgl_overhead = (y)->hca_conn_rdma_sgl_overhead; \
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2944
									\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2945
	(void) strlcpy((x)->hca_driver_name, (driver_name),		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2946
	    MAX_HCA_DRVNAME_LEN);					\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2947
	(x)->hca_driver_instance	= (instance);			\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2948
									\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2949
	(x)->hca_device_path = ((device_path_alloc_sz) >= (device_path_len)) \
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2950
	    ? (device_path) : NULL;					\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2951
	(x)->hca_device_path_len	= (device_path_len);		\
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2952
}
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2953
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2954
/*
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2955
 * IOCTL implementation to query HCA attributes
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2956
 */
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2957
static int
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2958
ibnex_ctl_query_hca(dev_t dev, int cmd, intptr_t arg, int mode,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2959
    cred_t *credp, int *rvalp)
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2960
{
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2961
	int			rv = 0;
10094
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2962
	ibnex_ctl_query_hca_t	*query_hca = NULL;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2963
	ibnex_ctl_query_hca_32_t *query_hca_32 = NULL;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2964
	ibt_hca_attr_t		*hca_attr = NULL;
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2965
	char			driver_name[MAX_HCA_DRVNAME_LEN];
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2966
	int			instance;
10094
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2967
	ib_guid_t		hca_guid;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2968
	char			*device_path;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2969
	uint_t			device_path_alloc_sz, hca_device_path_len;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2970
	char			*hca_device_path = NULL;
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2971
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2972
	IBTF_DPRINTF_L4("ibnex", "\tctl_query_hca: cmd=%x, arg=%p, "
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2973
	    "mode=%x, cred=%p, rval=%p, dev=0x%x", cmd, arg, mode, credp,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2974
	    rvalp, dev);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  2975
10094
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2976
#ifdef	_MULTI_DATAMODEL
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2977
	if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2978
		query_hca_32 = kmem_zalloc(
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2979
		    sizeof (ibnex_ctl_query_hca_32_t), KM_SLEEP);
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2980
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2981
		if (ddi_copyin((void *)arg, query_hca_32,
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2982
		    sizeof (ibnex_ctl_query_hca_32_t), mode) != 0) {
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2983
			IBTF_DPRINTF_L2("ibnex",
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2984
			    "\tctl_query_hca: ddi_copyin err 1");
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2985
			rv = EFAULT;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2986
			goto out;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2987
		}
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2988
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2989
		hca_guid = query_hca_32->hca_guid;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2990
		device_path = (char *)(uintptr_t)query_hca_32->hca_device_path;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2991
		device_path_alloc_sz = query_hca_32->hca_device_path_alloc_sz;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2992
	} else
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2993
#endif
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2994
	{
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2995
		query_hca = kmem_zalloc(sizeof (ibnex_ctl_query_hca_t),
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2996
		    KM_SLEEP);
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2997
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2998
		if (ddi_copyin((void *)arg, query_hca,
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  2999
		    sizeof (ibnex_ctl_query_hca_t), mode) != 0) {
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3000
			IBTF_DPRINTF_L2("ibnex",
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3001
			    "\tctl_query_hca: ddi_copyin err 2");
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3002
			rv = EFAULT;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3003
			goto out;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3004
		}
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3005
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3006
		hca_guid = query_hca->hca_guid;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3007
		device_path = query_hca->hca_device_path;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3008
		device_path_alloc_sz = query_hca->hca_device_path_alloc_sz;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3009
	}
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3010
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3011
	hca_attr = kmem_zalloc(sizeof (ibt_hca_attr_t), KM_SLEEP);
10094
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3012
	hca_device_path = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3013
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3014
	if (ibtl_ibnex_query_hca_byguid(hca_guid, hca_attr,
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3015
	    driver_name, sizeof (driver_name), &instance, hca_device_path)
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3016
	    != IBT_SUCCESS) {
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3017
		rv = ENXIO;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3018
		goto out;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3019
	}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3020
10094
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3021
	hca_device_path_len = strlen(hca_device_path) + 1;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3022
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3023
#ifdef	_MULTI_DATAMODEL
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3024
	if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3025
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3026
		IBNEX_CTL_CP_HCA_INFO(&query_hca_32->hca_info, hca_attr,
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3027
		    driver_name, instance, query_hca_32->hca_device_path,
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3028
		    device_path_alloc_sz, hca_device_path_len);
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3029
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3030
		/* copy hca information to the user space */
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3031
		if (ddi_copyout(&query_hca_32->hca_info,
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3032
		    &((ibnex_ctl_query_hca_32_t *)arg)->hca_info,
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3033
		    sizeof (ibnex_ctl_hca_info_32_t), mode) != 0) {
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3034
			IBTF_DPRINTF_L2("ibnex",
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3035
			    "\tctl_query_hca: ddi_copyout err 1");
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3036
			rv = EFAULT;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3037
			goto out;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3038
		}
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3039
	} else
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3040
#endif
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3041
	{
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3042
		IBNEX_CTL_CP_HCA_INFO(&query_hca->hca_info, hca_attr,
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3043
		    driver_name, instance, device_path,
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3044
		    device_path_alloc_sz, hca_device_path_len);
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3045
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3046
		/* copy hca information to the user space */
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3047
		if (ddi_copyout(&query_hca->hca_info,
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3048
		    &((ibnex_ctl_query_hca_t *)arg)->hca_info,
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3049
		    sizeof (ibnex_ctl_hca_info_t), mode) != 0) {
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3050
			IBTF_DPRINTF_L2("ibnex",
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3051
			    "\tctl_query_hca: ddi_copyout err 2");
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3052
			rv = EFAULT;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3053
			goto out;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3054
		}
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3055
	}
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3056
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3057
	if (device_path_alloc_sz >= hca_device_path_len) {
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3058
		if (ddi_copyout(hca_device_path,
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3059
		    device_path,
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3060
		    hca_device_path_len, mode) != 0) {
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3061
			IBTF_DPRINTF_L2("ibnex", "\tctl_query_hca: "
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3062
			    "ddi_copyout err copying device path");
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3063
			rv = EFAULT;
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3064
		}
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3065
	}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3066
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3067
out:
10094
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3068
	if (query_hca)
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3069
		kmem_free(query_hca, sizeof (ibnex_ctl_query_hca_t));
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3070
	if (query_hca_32)
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3071
		kmem_free(query_hca_32, sizeof (ibnex_ctl_query_hca_32_t));
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3072
	if (hca_attr)
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3073
		kmem_free(hca_attr, sizeof (ibt_hca_attr_t));
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3074
	if (hca_device_path)
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3075
		kmem_free(hca_device_path, MAXPATHLEN);
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3076
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3077
	return (rv);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3078
}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3079
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3080
#define	IBNEX_CTL_CP_PORT_INFO(x, y, sgid_tbl, pkey_tbl)	\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3081
{								\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3082
	(x)->p_lid		= (y)->p_opaque1;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3083
	(x)->p_qkey_violations	= (y)->p_qkey_violations;	\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3084
	(x)->p_pkey_violations	= (y)->p_pkey_violations;	\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3085
	(x)->p_sm_sl		= (y)->p_sm_sl;			\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3086
	(x)->p_phys_state	= (y)->p_phys_state;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3087
	(x)->p_sm_lid		= (y)->p_sm_lid;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3088
	(x)->p_linkstate	= (y)->p_linkstate;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3089
	(x)->p_port_num		= (y)->p_port_num;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3090
	(x)->p_width_supported	= (y)->p_width_supported;	\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3091
	(x)->p_width_enabled	= (y)->p_width_enabled;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3092
	(x)->p_width_active	= (y)->p_width_active;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3093
	(x)->p_mtu		= (y)->p_mtu;			\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3094
	(x)->p_lmc		= (y)->p_lmc;			\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3095
	(x)->p_speed_supported	= (y)->p_speed_supported;	\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3096
	(x)->p_speed_enabled	= (y)->p_speed_enabled;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3097
	(x)->p_speed_active	= (y)->p_speed_active;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3098
	(x)->p_sgid_tbl		= (sgid_tbl);			\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3099
	(x)->p_sgid_tbl_sz	= (y)->p_sgid_tbl_sz;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3100
	(x)->p_pkey_tbl		= (pkey_tbl);			\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3101
	(x)->p_pkey_tbl_sz	= (y)->p_pkey_tbl_sz;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3102
	(x)->p_def_pkey_ix	= (y)->p_def_pkey_ix;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3103
	(x)->p_max_vl		= (y)->p_max_vl;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3104
	(x)->p_init_type_reply	= (y)->p_init_type_reply;	\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3105
	(x)->p_subnet_timeout	= (y)->p_subnet_timeout;	\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3106
	(x)->p_capabilities	= (y)->p_capabilities;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3107
	(x)->p_msg_sz		= (y)->p_msg_sz;		\
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3108
}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3109
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3110
/*
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3111
 * IOCTL implementation to query HCA port attributes
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3112
 */
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3113
static int
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3114
ibnex_ctl_query_hca_port(dev_t dev, int cmd, intptr_t arg, int mode,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3115
    cred_t *credp, int *rvalp)
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3116
{
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3117
	ibt_hca_portinfo_t		*ibt_pi;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3118
	uint_t				nports;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3119
	uint_t				size = 0;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3120
	int				rv = 0;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3121
	ibnex_ctl_query_hca_port_t	*query_hca_port = NULL;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3122
	ibnex_ctl_query_hca_port_32_t	*query_hca_port_32 = NULL;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3123
	uint_t				sgid_tbl_sz;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3124
	uint16_t			pkey_tbl_sz;
10183
01ff23b04f4f 6860487 ioctl IBNEX_CTL_QUERY_PORT should return ENOENT for invalid port numbers
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10094
diff changeset
  3125
	ibt_hca_attr_t			hca_attr;
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3126
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3127
	IBTF_DPRINTF_L4("ibnex", "\tctl_query_hca_port: cmd=%x, arg=%p, "
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3128
	    "mode=%x, cred=%p, rval=%p, dev=0x%x", cmd, arg, mode, credp,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3129
	    rvalp, dev);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3130
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3131
	query_hca_port = kmem_zalloc(sizeof (ibnex_ctl_query_hca_port_t),
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3132
	    KM_SLEEP);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3133
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3134
#ifdef	_MULTI_DATAMODEL
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3135
	if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3136
		query_hca_port_32 = kmem_zalloc(
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3137
		    sizeof (ibnex_ctl_query_hca_port_32_t), KM_SLEEP);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3138
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3139
		if (ddi_copyin((void *)arg, query_hca_port_32,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3140
		    sizeof (ibnex_ctl_query_hca_port_32_t), mode) != 0) {
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3141
			IBTF_DPRINTF_L2("ibnex",
10094
cbc8983f4340 6857725 Add device path to IBNEX_CTL_QUERY_HCA return data
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9879
diff changeset
  3142
			    "\tctl_query_hca_port: ddi_copyin err 1");
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3143
			rv = EFAULT;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3144
			goto out;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3145
		}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3146
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3147
		query_hca_port->hca_guid = query_hca_port_32->hca_guid;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3148
		query_hca_port->port_num = query_hca_port_32->port_num;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3149
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3150
		query_hca_port->sgid_tbl =
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3151
		    (ib_gid_t *)(uintptr_t)query_hca_port_32->sgid_tbl;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3152
		query_hca_port->sgid_tbl_alloc_sz =
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3153
		    query_hca_port_32->sgid_tbl_alloc_sz;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3154
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3155
		query_hca_port->pkey_tbl =
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3156
		    (ib_pkey_t *)(uintptr_t)query_hca_port_32->pkey_tbl;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3157
		query_hca_port->pkey_tbl_alloc_sz =
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3158
		    query_hca_port_32->pkey_tbl_alloc_sz;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3159
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3160
	} else
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3161
#endif
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3162
	{
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3163
		if (ddi_copyin((void *)arg, query_hca_port,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3164
		    sizeof (ibnex_ctl_query_hca_port_t), mode) != 0) {
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3165
			IBTF_DPRINTF_L2("ibnex",
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3166
			    "\tctl_query_hca_port: ddi_copyin err 2");
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3167
			rv = EFAULT;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3168
			goto out;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3169
		}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3170
	}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3171
10183
01ff23b04f4f 6860487 ioctl IBNEX_CTL_QUERY_PORT should return ENOENT for invalid port numbers
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10094
diff changeset
  3172
	if (ibt_query_hca_byguid(query_hca_port->hca_guid, &hca_attr) !=
01ff23b04f4f 6860487 ioctl IBNEX_CTL_QUERY_PORT should return ENOENT for invalid port numbers
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10094
diff changeset
  3173
	    IBT_SUCCESS) {
01ff23b04f4f 6860487 ioctl IBNEX_CTL_QUERY_PORT should return ENOENT for invalid port numbers
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10094
diff changeset
  3174
		rv = ENXIO;
01ff23b04f4f 6860487 ioctl IBNEX_CTL_QUERY_PORT should return ENOENT for invalid port numbers
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10094
diff changeset
  3175
		goto out;
01ff23b04f4f 6860487 ioctl IBNEX_CTL_QUERY_PORT should return ENOENT for invalid port numbers
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10094
diff changeset
  3176
	}
01ff23b04f4f 6860487 ioctl IBNEX_CTL_QUERY_PORT should return ENOENT for invalid port numbers
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10094
diff changeset
  3177
01ff23b04f4f 6860487 ioctl IBNEX_CTL_QUERY_PORT should return ENOENT for invalid port numbers
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10094
diff changeset
  3178
	if (query_hca_port->port_num == 0 ||
01ff23b04f4f 6860487 ioctl IBNEX_CTL_QUERY_PORT should return ENOENT for invalid port numbers
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10094
diff changeset
  3179
	    query_hca_port->port_num > hca_attr.hca_nports) {
01ff23b04f4f 6860487 ioctl IBNEX_CTL_QUERY_PORT should return ENOENT for invalid port numbers
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10094
diff changeset
  3180
		rv = ENOENT;
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3181
		goto out;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3182
	}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3183
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3184
	/*
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3185
	 * Query hca port attributes and copy them to the user space.
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3186
	 */
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3187
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3188
	if (ibt_query_hca_ports_byguid(query_hca_port->hca_guid,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3189
	    query_hca_port->port_num, &ibt_pi, &nports, &size) != IBT_SUCCESS) {
10183
01ff23b04f4f 6860487 ioctl IBNEX_CTL_QUERY_PORT should return ENOENT for invalid port numbers
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 10094
diff changeset
  3190
		rv = ENXIO;
9879
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3191
		goto out;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3192
	}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3193
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3194
	sgid_tbl_sz = MIN(query_hca_port->sgid_tbl_alloc_sz,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3195
	    ibt_pi->p_sgid_tbl_sz);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3196
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3197
	pkey_tbl_sz = MIN(query_hca_port->pkey_tbl_alloc_sz,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3198
	    ibt_pi->p_pkey_tbl_sz);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3199
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3200
#ifdef	_MULTI_DATAMODEL
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3201
	if (ddi_model_convert_from(mode & FMODELS) == DDI_MODEL_ILP32) {
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3202
		IBNEX_CTL_CP_PORT_INFO(
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3203
		    &query_hca_port_32->port_info, ibt_pi,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3204
		    query_hca_port_32->sgid_tbl, query_hca_port_32->pkey_tbl);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3205
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3206
		if (ddi_copyout(&query_hca_port_32->port_info,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3207
		    &((ibnex_ctl_query_hca_port_32_t *)arg)->port_info,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3208
		    sizeof (ibnex_ctl_hca_port_info_32_t), mode) != 0 ||
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3209
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3210
		    ddi_copyout(ibt_pi->p_sgid_tbl,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3211
		    query_hca_port->sgid_tbl,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3212
		    sgid_tbl_sz * sizeof (ib_gid_t), mode) != 0 ||
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3213
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3214
		    ddi_copyout(ibt_pi->p_pkey_tbl,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3215
		    query_hca_port->pkey_tbl,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3216
		    pkey_tbl_sz * sizeof (ib_pkey_t), mode) != 0) {
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3217
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3218
			IBTF_DPRINTF_L2("ibnex",
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3219
			    "\tctl_query_hca_port: ddi_copyout err 2");
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3220
			rv = EFAULT;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3221
			goto out;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3222
		}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3223
	} else
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3224
#endif
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3225
	{
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3226
		IBNEX_CTL_CP_PORT_INFO(
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3227
		    &query_hca_port->port_info, ibt_pi,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3228
		    query_hca_port->sgid_tbl, query_hca_port->pkey_tbl);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3229
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3230
		if (ddi_copyout(&query_hca_port->port_info,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3231
		    &((ibnex_ctl_query_hca_port_t *)arg)->port_info,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3232
		    sizeof (ibnex_ctl_hca_port_info_t), mode) != 0 ||
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3233
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3234
		    ddi_copyout(ibt_pi->p_sgid_tbl,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3235
		    query_hca_port->sgid_tbl,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3236
		    sgid_tbl_sz * sizeof (ib_gid_t), mode) != 0 ||
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3237
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3238
		    ddi_copyout(ibt_pi->p_pkey_tbl,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3239
		    query_hca_port->pkey_tbl,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3240
		    pkey_tbl_sz * sizeof (ib_pkey_t), mode) != 0) {
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3241
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3242
			IBTF_DPRINTF_L2("ibnex",
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3243
			    "\tctl_query_hca_port: ddi_copyout err 2");
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3244
			rv = EFAULT;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3245
			goto out;
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3246
		}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3247
	}
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3248
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3249
out:
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3250
	if (size > 0)
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3251
		ibt_free_portinfo(ibt_pi, size);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3252
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3253
	if (query_hca_port)
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3254
		kmem_free(query_hca_port, sizeof (ibnex_ctl_query_hca_port_t));
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3255
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3256
	if (query_hca_port_32)
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3257
		kmem_free(query_hca_port_32,
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3258
		    sizeof (ibnex_ctl_query_hca_port_32_t));
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3259
	return (rv);
2547a76dc28b 6832231 new info ioctls for ibnex
Ramaswamy Tummala <Ramaswamy.Tummala@Sun.COM>
parents: 9778
diff changeset
  3260
}