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