usr/src/uts/common/sys/mdi_impldefs.h
author ramat
Thu, 10 Nov 2005 07:14:29 -0800
changeset 878 964ddd439490
parent 0 68f95e015346
child 972 ecff7ea4cc40
permissions -rw-r--r--
PSARC 2005/583 VHCI Driven Device Enumeration 4938301 scsi_vhci does not enumerate devices on-demand (BUS_CONFIG_ONE)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#ifndef	_SYS_MDI_IMPLDEFS_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#define	_SYS_MDI_IMPLDEFS_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <sys/note.h>
878
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
    33
#include <sys/types.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/sunmdi.h>
878
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
    35
#include <sys/modhash.h>
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
    36
#include <sys/callb.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
extern "C" {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#ifdef _KERNEL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 * Multipath Driver Interfaces
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 * The multipathing framework is provided in two modules.  The 'mpxio' misc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 * module provides the core multipath framework and the 'scsi_vhci' nexus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
 * driver provides the SCSI-III command set driver functionality for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 * managing Fibre-Channel storage devices.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 * As in any multipathing solution there are three major problems to solve:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 * 1) Identification and enumeration of multipath client devices.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 * 2) Optimal path selection when routing I/O requests.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
 * 3) Observability interfaces to snapshot the multipath configuration,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
 *    and infrastructure to provide performance and error statistics.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
 * The mpxio framework consists of several major components:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 * 1) The MDI is the Multiplexed Device Interface; this is the core glue which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
 *    holds the following components together.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
 * 2) vHCI (Virtual Host Controller Interconnect) drivers provide multipathing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
 *    services for a given bus technology (example: 'scsi_vhci' provides
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
 *    multipathing support for SCSI-III fibre-channel devices).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
 * 3) pHCI (Physical Host Controller Interconnect) drivers provide transport
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 *    services for a given host controller (example: 'fcp' provides transport
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 *    for fibre-channel devices).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 * 4) Client Devices are standard Solaris target (or leaf) drivers
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
 *    (example: 'ssd' is the standard disk driver for fibre-channel arrays).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
 * 5) Multipath information nodes ('pathinfo' nodes) connect client device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
 *    nodes and pHCI device nodes in the device tree.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
 * With the scsi_vhci, a QLC card, and mpxio enabled, the device tree might
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
 * look like this:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
 *	+-----------+   +-----------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
 *      | scsi_vhci |   |  pci@1f,0 |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
 *      +-----------+   +-----------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
 *         /     \               \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
 * +----------+ +-----------+    +-------------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
 * | ssd1     | | ssd2	    |    | qlc@0,0     |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
 * +----------+ +-----------+    +-------------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
 *   |          |                  /        \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
 *   |          |        +-------------+   +------------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
 *   |          |        | pHCI 1      |   |  pHCI 2    |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
 *   |          |        +-------------+   +------------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 *   |          |          /        |      /          |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
 *   |          |    +------+       |    +------+     |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
 *   |          |    |  ssd |       |    |  ssd |     |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
 *   |          |    | (OBP)|       |    | (OBP)|     |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
 *   |          |    +------+       |    +------+     |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
 *   |          |                   |                 |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
 *   |          |               +-------+           +--------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
 *   |          +-------------->| path  |---------->| path   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
 *   |                          | info  |           | info   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
 *   |                          | node 1|           | node 3 |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
 *   |                          +-------+           +--------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
 *   |                              |                 |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
 *   |                          +-------+           +--------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
 *   +------------------------->| path  |---------->| path   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
 *                              | info  |           | info   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
 *                              | node 2|           | node 4 |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
 *                              +-------+           +--------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
 * The multipath information nodes (mdi_pathinfo nodes) establish the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
 * relationship between the pseudo client driver instance nodes and the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
 * physical host controller interconnect (pHCI drivers) forming a matrix
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
 * structure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
 * The mpxio module implements locking at multiple granularity levels to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
 * support the needs of various consumers.  The multipath matrix can be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
 * globally locked, column locked, or row locked depending on the consumer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
 * The intention is to balance simplicity and performance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
 * Locking:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
 * The current implementation utilizes the following locks:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
 *   mdi_mutex: protects the vHCI list, per-vHCI structure and the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
 *   list of pHCIs and Client devices registered against them (protection
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
 *   against multi-threaded add/remove).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
 *   devinfo_tree_lock (rw): protects system wide creation/removal of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
 *   mdi_pathinfo nodes into the multipath matrix.  Consumers (like the devinfo
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
 *   driver) can freeze the configuration by acquiring this as a reader.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
 *   per-pHCI (mutex) lock: protects the column (pHCI-mdi_pathinfo node list)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
 *   and per-pHCI structure fields.  mdi_pathinfo node creation, deletion and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
 *   child mdi_pathinfo node state changes are serialized on per pHCI basis
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
 *   (Protection against DR).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
 *   per-client (mutex) lock: protects the row (client-mdi_pathinfo node list)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
 *   and per-client structure fields.  The client-mdi_pathinfo node list is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
 *   typically walked to select an optimal path when routing I/O requests.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
 *   per-mdi_pathinfo (mutex) lock: protects the mdi_pathinfo node structure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
 *   fields.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
 * Note that per-Client structure and per-pHCI fields are freely readable when
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
 * corresponding mdi_pathinfo locks are held, since holding an mdi_pathinfo
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
 * node guarantees that its corresponding client and pHCI devices will not be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
 * freed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
 * MDI Client global unique identifier property name string definition
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
extern const char			*mdi_client_guid_prop;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
#define	MDI_CLIENT_GUID_PROP		(char *)mdi_client_guid_prop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
 * MDI Client load balancing policy definitions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
 * Load balancing policies are determined on a per-vHCI basis and are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
 * configurable via the vHCI's driver.conf file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
typedef enum {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	LOAD_BALANCE_NONE,		/* Alternate pathing		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	LOAD_BALANCE_RR,		/* Round Robin			*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	LOAD_BALANCE_LBA		/* Logical Block Addressing	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
} client_lb_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
typedef struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	int region_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
}client_lb_args_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
 * MDI client load balancing property name/value string definitions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
extern const char			*mdi_load_balance;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
extern const char			*mdi_load_balance_none;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
extern const char			*mdi_load_balance_ap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
extern const char			*mdi_load_balance_rr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
extern const char			*mdi_load_balance_lba;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
#define	LOAD_BALANCE_PROP		(char *)mdi_load_balance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
#define	LOAD_BALANCE_PROP_NONE		(char *)mdi_load_balance_none
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
#define	LOAD_BALANCE_PROP_AP		(char *)mdi_load_balance_ap
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
#define	LOAD_BALANCE_PROP_RR		(char *)mdi_load_balance_rr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
#define	LOAD_BALANCE_PROP_LBA		(char *)mdi_load_balance_lba
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
/* default for region size */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
#define	LOAD_BALANCE_DEFAULT_REGION_SIZE	18
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
 * vHCI drivers:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
 * vHCI drivers are pseudo nexus drivers which implement multipath services
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
 * for a specific command set or bus architecture ('class').  There is a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
 * single instance of the vHCI driver for each command set which supports
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
 * multipath devices.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
 * Each vHCI driver registers the following callbacks from attach(9e).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
#define	MDI_VHCI_OPS_REV_1		1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
 * Change MDI_VHCI_OPS_REV_NAME as per MDI_VHCI_OPS_REV
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
#define	MDI_VHCI_OPS_REV	MDI_VHCI_OPS_REV_1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
#define	MDI_VHCI_OPS_REV_NAME	"1"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
typedef struct mdi_vhci_ops {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	/* revision management */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	int	vo_revision;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	/* mdi_pathinfo node init callback */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	int	(*vo_pi_init)(dev_info_t *vdip, mdi_pathinfo_t *pip, int flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	/* mdi_pathinfo node uninit callback */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	int	(*vo_pi_uninit)(dev_info_t *vdip, mdi_pathinfo_t *pip,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
		    int flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	/* mdi_pathinfo node state change callback */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	int	(*vo_pi_state_change)(dev_info_t *vdip, mdi_pathinfo_t *pip,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
		    mdi_pathinfo_state_t state, uint32_t, int flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	/* Client path failover callback */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
	int	(*vo_failover)(dev_info_t *vdip, dev_info_t *cdip, int flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
} mdi_vhci_ops_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
 * An mdi_vhci structure is created and bound to the devinfo node of every
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
 * registered vHCI class driver; this happens when a vHCI registers itself from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
 * attach(9e).  This structure is unbound and freed when the vHCI unregisters
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
 * at detach(9e) time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
 * Each vHCI driver is associated with a vHCI class name; this is the handle
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
 * used to register and unregister pHCI drivers for a given transport.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
 * Locking: This structure is guarded by the mdi_mutex; however, depending
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
 * on the context, some of the fields can be freely read without holding any
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
 * locks (ex. holding a child's lock also guarantees that the vHCI (parent)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
 * cannot be unexpectedly freed).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
typedef struct mdi_vhci {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	struct mdi_vhci		*vh_next;	/* next link		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	struct mdi_vhci		*vh_prev;	/* prev link		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	int			vh_flags;	/* Operation flags	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	dev_info_t		*vh_dip;	/* devi handle		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	char			*vh_class;	/* Class name		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	struct mdi_vhci_ops	*vh_ops;	/* Callback vectors	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	client_lb_t		vh_lb;		/* Global cache		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	int			vh_phci_count;	/* pHCI device count	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	struct mdi_phci		*vh_phci_head;	/* pHCI list head	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	struct mdi_phci		*vh_phci_tail;	/* pHCI list tail	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	int			vh_client_count;	/* Client count	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	struct client_hash	*vh_client_table;	/* Client hash	*/
878
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   249
	int			vh_refcnt;	/* reference count */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   250
	struct mdi_vhci_config	*vh_config;	/* vhci config */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
} mdi_vhci_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
 * GUID Hash definitions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
 * Since all the mpxio managed devices for a given class are enumerated under
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
 * the single vHCI instance for that class, sequentially walking through the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
 * client device link to find a client would be prohibitively slow.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
#define	CLIENT_HASH_TABLE_SIZE	(32)	/* GUID hash */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
 * Client hash table structure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
struct client_hash {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	struct mdi_client	*ct_hash_head;	/* Client hash head	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	int			ct_hash_count;	/* Client hash count	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
 * pHCI Drivers:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
 * Physical HBA drivers provide transport services for mpxio-managed devices.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
 * As each pHCI instance is attached, it must register itself with the mpxio
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
 * framework using mdi_phci_register().  When the pHCI is detached it must
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
 * similarly call mdi_phci_unregister().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
 * The framework maintains a list of registered pHCI device instances for each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
 * vHCI.  This list is vHCI->vh_phci_count, vHCI->vh_phci_head,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
 * vHCI->vh_phci_tail and pHCI->ph_next.  This list is protected by the global
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
 * mdi_mutex.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
 * Locking order:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
 * _NOTE(LOCK_ORDER(mdi_mutex, mdi_phci::ph_mutex))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
 * _NOTE(LOCK_ORDER(mdi_phci::ph_mutex devinfo_tree_lock))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
typedef struct mdi_phci {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	kmutex_t		ph_mutex;	/* per-pHCI mutex	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	struct mdi_phci		*ph_next;	/* next link		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
	struct mdi_phci		*ph_prev;	/* prev link		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	dev_info_t		*ph_dip;	/* devi handle		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	struct mdi_vhci 	*ph_vhci;	/* back ref. to vHCI	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
	int			ph_flags;	/* pHCI operation flags	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
	int			ph_path_count;	/* child pi count	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	mdi_pathinfo_t		*ph_path_head;	/* pi list head		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	mdi_pathinfo_t		*ph_path_tail;	/* pi list tail		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	int			ph_unstable;	/* Paths in transient state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	kcondvar_t		ph_unstable_cv;	/* Paths in transient state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	kcondvar_t		ph_powerchange_cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
						/* Paths in transient state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	void			*ph_vprivate;	/* vHCI driver private	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
} mdi_phci_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
 * A pHCI device is 'unstable' while one or more paths are in a transitional
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
 * state.  Hotplugging is prevented during this state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
#define	MDI_PHCI_UNSTABLE(ph)		(ph)->ph_unstable++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
#define	MDI_PHCI_STABLE(ph) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	(ph)->ph_unstable--; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	if ((ph)->ph_unstable == 0) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
		cv_broadcast(&(ph)->ph_unstable_cv); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	} \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
 * per-pHCI lock macros
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
#define	MDI_PHCI_LOCK(ph)		mutex_enter(&((ph))->ph_mutex)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
#define	MDI_PHCI_TRYLOCK(ph)		mutex_tryenter(&((ph))->ph_mutex)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
#define	MDI_PHCI_UNLOCK(ph)		mutex_exit(&((ph))->ph_mutex)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
 * pHCI state definitions and macros to track the pHCI driver instance state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
#define	MDI_PHCI_FLAGS_OFFLINE		0x1	/* pHCI is offline */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
#define	MDI_PHCI_FLAGS_SUSPEND		0x2	/* pHCI is suspended */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
#define	MDI_PHCI_FLAGS_POWER_DOWN	0x4	/* pHCI is power down */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
#define	MDI_PHCI_FLAGS_DETACH		0x8	/* pHCI is detached */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
#define	MDI_PHCI_FLAGS_USER_DISABLE	0x10	/* pHCI is disabled,user */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
#define	MDI_PHCI_FLAGS_D_DISABLE	0x20	/* pHCI is disabled,driver */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
#define	MDI_PHCI_FLAGS_D_DISABLE_TRANS	0x40	/* pHCI is disabled,transient */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
#define	MDI_PHCI_FLAGS_POWER_TRANSITION	0x80	/* pHCI is power transition */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
#define	MDI_PHCI_DISABLE_MASK	(~(MDI_PHCI_FLAGS_USER_DISABLE | \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
				MDI_PHCI_FLAGS_D_DISABLE | \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
				MDI_PHCI_FLAGS_D_DISABLE_TRANS))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
#define	MDI_PHCI_IS_READY(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	(((ph)->ph_flags &  (MDI_PHCI_DISABLE_MASK)) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
#define	MDI_PHCI_SET_OFFLINE(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	    ((ph)->ph_flags |= MDI_PHCI_FLAGS_OFFLINE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
#define	MDI_PHCI_SET_ONLINE(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	    ((ph)->ph_flags &= ~MDI_PHCI_FLAGS_OFFLINE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
#define	MDI_PHCI_SET_SUSPEND(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	    ((ph)->ph_flags |= MDI_PHCI_FLAGS_SUSPEND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
#define	MDI_PHCI_SET_RESUME(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	    ((ph)->ph_flags &= ~MDI_PHCI_FLAGS_SUSPEND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
#define	MDI_PHCI_IS_OFFLINE(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	    ((ph)->ph_flags & MDI_PHCI_FLAGS_OFFLINE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
#define	MDI_PHCI_IS_SUSPENDED(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	    ((ph)->ph_flags & MDI_PHCI_FLAGS_SUSPEND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
#define	MDI_PHCI_SET_DETACH(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	    ((ph)->ph_flags |= MDI_PHCI_FLAGS_DETACH)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
#define	MDI_PHCI_SET_ATTACH(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	    ((ph)->ph_flags &= ~MDI_PHCI_FLAGS_DETACH)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
#define	MDI_PHCI_SET_POWER_DOWN(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	    ((ph)->ph_flags |= MDI_PHCI_FLAGS_POWER_DOWN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
#define	MDI_PHCI_SET_POWER_UP(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	    ((ph)->ph_flags &= ~MDI_PHCI_FLAGS_POWER_DOWN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
#define	MDI_PHCI_SET_USER_ENABLE(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
		((ph)->ph_flags &= ~MDI_PHCI_FLAGS_USER_DISABLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
#define	MDI_PHCI_SET_USER_DISABLE(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
		((ph)->ph_flags |= MDI_PHCI_FLAGS_USER_DISABLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
#define	MDI_PHCI_SET_DRV_ENABLE(ph)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
		((ph)->ph_flags &= ~MDI_PHCI_FLAGS_D_DISABLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
#define	MDI_PHCI_SET_DRV_DISABLE(ph)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
		((ph)->ph_flags |= MDI_PHCI_FLAGS_D_DISABLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
#define	MDI_PHCI_SET_DRV_ENABLE_TRANSIENT(ph)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
		((ph)->ph_flags &= ~MDI_PHCI_FLAGS_D_DISABLE_TRANS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
#define	MDI_PHCI_SET_DRV_DISABLE_TRANSIENT(ph)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
		((ph)->ph_flags |= MDI_PHCI_FLAGS_D_DISABLE_TRANS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
#define	MDI_PHCI_IS_USER_DISABLED(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
		((ph)->ph_flags & MDI_PHCI_FLAGS_USER_DISABLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
#define	MDI_PHCI_IS_DRV_DISABLED_TRANSIENT(ph)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
		((ph)->ph_flags & MDI_PHCI_FLAGS_D_DISABLE_TRANS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
#define	MDI_PHCI_IS_DRV_DISABLED(ph)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
		((ph)->ph_flags & MDI_PHCI_FLAGS_D_DISABLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
#define	MDI_PHCI_IS_POWERED_DOWN(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	    ((ph)->ph_flags & MDI_PHCI_FLAGS_POWER_DOWN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
#define	MDI_PHCI_SET_POWER_TRANSITION(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
	    ((ph)->ph_flags |= MDI_PHCI_FLAGS_POWER_TRANSITION)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
#define	MDI_PHCI_CLEAR_POWER_TRANSITION(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	    ((ph)->ph_flags &= ~MDI_PHCI_FLAGS_POWER_TRANSITION)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
#define	MDI_PHCI_IS_POWER_TRANSITION(ph) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
	    ((ph)->ph_flags & MDI_PHCI_FLAGS_POWER_TRANSITION)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
 * mpxio Managed Clients:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
 * This framework creates a struct mdi_client for every client device created
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
 * by the framework as a result of self-enumeration of target devices by the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
 * registered pHCI devices.  This structure is bound to client device dev_info
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
 * node at the time of client device allocation (ndi_devi_alloc(9e)). This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
 * structure is unbound from the dev_info node when mpxio framework removes a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
 * client device node from the system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
 * This structure is created when a first path is enumerated and removed when
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
 * last path is de-enumerated from the system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
 * Multipath client devices are instantiated as children of corresponding vHCI
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
 * driver instance. Each client device is uniquely identified by a GUID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
 * provided by target device itself.  The parent vHCI device also maintains a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
 * hashed list of client devices, protected by the global mdi_mutex.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
 * Typically pHCI devices self-enumerate their child devices using taskq,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
 * resulting in multiple paths to the same client device to be enumerated by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
 * competing threads.  mdi_mutex is also used to serialize the client device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
 * creation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
 * Currently this framework supports two kinds of load-balancing policy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
 * configurable through the vHCI driver configuration files.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
 * NONE		- Legacy AP mode
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
 * Round Robin	- Balance the pHCI load in a Round Robin fashion.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
 * This framework identifies the client device in three distinct states:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
 * OPTIMAL	- Client device has atleast one redundant path.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
 * DEGRADED	- No redundant paths (critical).  Failure in the current active
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
 *                path would result in data access failures.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
 * FAILED 	- No paths are available to access this device.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
 * Locking order:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
 * _NOTE(LOCK_ORDER(mdi_mutex, mdi_client::ct_mutex))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
 * _NOTE(LOCK_ORDER(mdi_client::ct_mutex devinfo_tree_lock))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
typedef struct mdi_client {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	kmutex_t		ct_mutex;	/* per-client mutex	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	struct mdi_client	*ct_hnext;	/* next client		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	struct mdi_client	*ct_hprev;	/* prev client		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
	dev_info_t		*ct_dip;	/* client devi handle	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	struct mdi_vhci		*ct_vhci;	/* vHCI back ref	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	char			*ct_drvname;	/* client driver name	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
	char			*ct_guid;	/* client guid		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	void			*ct_cprivate;	/* client driver private */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	client_lb_t		ct_lb;		/* load balancing scheme */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	client_lb_args_t	*ct_lb_args; 	/* load balancing args */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	int			ct_flags;	/* Driver op. flags	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
	int			ct_state;	/* state information	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	int			ct_failover_flags;	/* Failover args */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	int			ct_failover_status;	/* last fo status */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	kcondvar_t		ct_failover_cv;	/* Failover status cv	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
	int			ct_path_count;	/* multi path count	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
	mdi_pathinfo_t		*ct_path_head;	/* multi path list head	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
	mdi_pathinfo_t		*ct_path_tail;	/* multi path list tail	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	mdi_pathinfo_t		*ct_path_last;	/* last path used for i/o */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	int			ct_unstable;	/* Paths in transient state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	kcondvar_t		ct_unstable_cv;	/* Paths in transient state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	int			ct_power_cnt;	/* Hold count on parent power */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
	kcondvar_t		ct_powerchange_cv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
					/* Paths in power transient state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
	int			ct_powercnt_held;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
					/* ct_power_cnt held in pre_unconfig */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	int			ct_powercnt_reset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
					/* ct_power_cnt was resetted */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
	void			*ct_vprivate;	/* vHCI driver private	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
} mdi_client_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
 * per-Client device locking definitions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
#define	MDI_CLIENT_LOCK(ct)		mutex_enter(&((ct))->ct_mutex)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
#define	MDI_CLIENT_TRYLOCK(ct)		mutex_tryenter(&((ct))->ct_mutex)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
#define	MDI_CLIENT_UNLOCK(ct)		mutex_exit(&((ct))->ct_mutex)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
 * A Client device is in unstable while one or more paths are in transitional
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
 * state.  We do not allow failover to take place while paths are in transient
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
 * state. Similarly we do not allow state transition while client device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
 * failover is in progress.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
#define	MDI_CLIENT_UNSTABLE(ct)		(ct)->ct_unstable++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
#define	MDI_CLIENT_STABLE(ct) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	(ct)->ct_unstable--; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
	if ((ct)->ct_unstable == 0) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
		cv_broadcast(&(ct)->ct_unstable_cv); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
	} \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
 * Client driver instance state definitions:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
#define	MDI_CLIENT_FLAGS_OFFLINE		0x00000001
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
#define	MDI_CLIENT_FLAGS_SUSPEND		0x00000002
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
#define	MDI_CLIENT_FLAGS_POWER_DOWN		0x00000004
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
#define	MDI_CLIENT_FLAGS_DETACH			0x00000008
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
#define	MDI_CLIENT_FLAGS_FAILOVER		0x00000010
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
#define	MDI_CLIENT_FLAGS_REPORT_DEV		0x00000020
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
#define	MDI_CLIENT_FLAGS_PATH_FREE_IN_PROGRESS	0x00000040
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
#define	MDI_CLIENT_FLAGS_ASYNC_FREE		0x00000080
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
#define	MDI_CLIENT_FLAGS_DEV_NOT_SUPPORTED	0x00000100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
#define	MDI_CLIENT_FLAGS_POWER_TRANSITION	0x00000200
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
#define	MDI_CLIENT_SET_OFFLINE(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	    ((ct)->ct_flags |= MDI_CLIENT_FLAGS_OFFLINE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
#define	MDI_CLIENT_SET_ONLINE(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
	    ((ct)->ct_flags &= ~MDI_CLIENT_FLAGS_OFFLINE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
#define	MDI_CLIENT_IS_OFFLINE(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	    ((ct)->ct_flags & MDI_CLIENT_FLAGS_OFFLINE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
#define	MDI_CLIENT_SET_SUSPEND(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
	    ((ct)->ct_flags |= MDI_CLIENT_FLAGS_SUSPEND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
#define	MDI_CLIENT_SET_RESUME(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
	    ((ct)->ct_flags &= ~MDI_CLIENT_FLAGS_SUSPEND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
#define	MDI_CLIENT_IS_SUSPENDED(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
	    ((ct)->ct_flags & MDI_CLIENT_FLAGS_SUSPEND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
#define	MDI_CLIENT_SET_POWER_DOWN(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
	    ((ct)->ct_flags |= MDI_CLIENT_FLAGS_POWER_DOWN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
#define	MDI_CLIENT_SET_POWER_UP(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
	    ((ct)->ct_flags &= ~MDI_CLIENT_FLAGS_POWER_DOWN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
#define	MDI_CLIENT_IS_POWERED_DOWN(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	    ((ct)->ct_flags & MDI_CLIENT_FLAGS_POWER_DOWN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
#define	MDI_CLIENT_SET_POWER_TRANSITION(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
	    ((ct)->ct_flags |= MDI_CLIENT_FLAGS_POWER_TRANSITION)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
#define	MDI_CLIENT_CLEAR_POWER_TRANSITION(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
	    ((ct)->ct_flags &= ~MDI_CLIENT_FLAGS_POWER_TRANSITION)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
#define	MDI_CLIENT_IS_POWER_TRANSITION(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
	    ((ct)->ct_flags & MDI_CLIENT_FLAGS_POWER_TRANSITION)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
#define	MDI_CLIENT_SET_DETACH(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	    ((ct)->ct_flags |= MDI_CLIENT_FLAGS_DETACH)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
#define	MDI_CLIENT_SET_ATTACH(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
	    ((ct)->ct_flags &= ~MDI_CLIENT_FLAGS_DETACH)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
#define	MDI_CLIENT_IS_DETACHED(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	    ((ct)->ct_flags & MDI_CLIENT_FLAGS_DETACH)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
#define	MDI_CLIENT_SET_FAILOVER_IN_PROGRESS(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
	    ((ct)->ct_flags |= MDI_CLIENT_FLAGS_FAILOVER)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
#define	MDI_CLIENT_CLEAR_FAILOVER_IN_PROGRESS(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
	    ((ct)->ct_flags &= ~MDI_CLIENT_FLAGS_FAILOVER)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
#define	MDI_CLIENT_IS_FAILOVER_IN_PROGRESS(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
	    ((ct)->ct_flags & MDI_CLIENT_FLAGS_FAILOVER)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
#define	MDI_CLIENT_SET_REPORT_DEV_NEEDED(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	    ((ct)->ct_flags |= MDI_CLIENT_FLAGS_REPORT_DEV)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
#define	MDI_CLIENT_CLEAR_REPORT_DEV_NEEDED(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
	    ((ct)->ct_flags &= ~MDI_CLIENT_FLAGS_REPORT_DEV)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
#define	MDI_CLIENT_IS_REPORT_DEV_NEEDED(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	    ((ct)->ct_flags & MDI_CLIENT_FLAGS_REPORT_DEV)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
#define	MDI_CLIENT_SET_PATH_FREE_IN_PROGRESS(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	    ((ct)->ct_flags |= MDI_CLIENT_FLAGS_PATH_FREE_IN_PROGRESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
#define	MDI_CLIENT_CLEAR_PATH_FREE_IN_PROGRESS(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
	    ((ct)->ct_flags &= ~MDI_CLIENT_FLAGS_PATH_FREE_IN_PROGRESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
#define	MDI_CLIENT_IS_PATH_FREE_IN_PROGRESS(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
	    ((ct)->ct_flags & MDI_CLIENT_FLAGS_PATH_FREE_IN_PROGRESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
#define	MDI_CLIENT_SET_DEV_NOT_SUPPORTED(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
	    ((ct)->ct_flags |= MDI_CLIENT_FLAGS_DEV_NOT_SUPPORTED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
#define	MDI_CLIENT_IS_DEV_NOT_SUPPORTED(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
	    ((ct)->ct_flags & MDI_CLIENT_FLAGS_DEV_NOT_SUPPORTED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
 * Client operating states.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
#define	MDI_CLIENT_STATE_OPTIMAL	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
#define	MDI_CLIENT_STATE_DEGRADED	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
#define	MDI_CLIENT_STATE_FAILED		3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
#define	MDI_CLIENT_STATE(ct) ((ct)->ct_state)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
#define	MDI_CLIENT_SET_STATE(ct, state) ((ct)->ct_state = state)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
#define	MDI_CLIENT_IS_FAILED(ct) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
	    ((ct)->ct_state == MDI_CLIENT_STATE_FAILED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
 * mdi_pathinfo nodes:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
 * From this framework's perspective, a 'path' is a tuple consisting of a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
 * client or end device, a host controller which provides device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
 * identification and transport services (pHCI), and bus specific unit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
 * addressing information.  A path may be decorated with properties which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
 * describe the capabilities of the path; such properties are analogous to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
 * device node and minor node properties.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
 * The framework maintains link list of mdi_pathinfo nodes created by every
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
 * pHCI driver instance via the pi_phci_link linkage; this is used (for example)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
 * to make sure that all relevant pathinfo nodes are freed before the pHCI
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
 * is unregistered.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
 * Locking order:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
 * _NOTE(LOCK_ORDER(mdi_phci::ph_mutex mdi_pathinfo::pi_mutex))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
 * _NOTE(LOCK_ORDER(mdi_client::ct_mutex mdi_pathinfo::pi_mutex))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
 * _NOTE(LOCK_ORDER(mdi_phci::ph_mutex mdi_client::ct_mutex))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
 * _NOTE(LOCK_ORDER(devinfo_tree_lock mdi_pathinfo::pi_mutex))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
 * mdi_pathinfo node structure definition
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
struct mdi_pathinfo {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
	kmutex_t		pi_mutex;	/* per path mutex	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
	mdi_pathinfo_state_t	pi_state;	/* path state		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
	mdi_pathinfo_state_t	pi_old_state;	/* path state		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
	kcondvar_t		pi_state_cv;	/* path state condvar	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
	mdi_client_t		*pi_client;	/* client		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
	mdi_phci_t		*pi_phci;	/* pHCI dev_info node	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
	char			*pi_addr;	/* path unit address	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
	nvlist_t		*pi_prop;	/* Properties		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
	void			*pi_cprivate;	/* client private info	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
	void			*pi_pprivate;	/* phci private info	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
	struct mdi_pathinfo	*pi_client_link; /* next path in client list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
	struct mdi_pathinfo	*pi_phci_link;	 /* next path in phci list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
	int			pi_ref_cnt;	/* pi reference count	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
	kcondvar_t		pi_ref_cv;	/* condition variable	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
	struct mdi_pi_kstats	*pi_kstats;	/* aggregate kstats */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
	int			pi_pm_held;	/* phci's kidsup incremented */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
	int			pi_preferred;	/* Preferred path 	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
	void			*pi_vprivate;	/* vhci private info	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
 * pathinfo statistics:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
 * The mpxio architecture allows for multiple pathinfo nodes for each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
 * client-pHCI combination.  For statistics purposes, these statistics are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
 * aggregated into a single client-pHCI set of kstats.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
struct mdi_pi_kstats {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
	int	pi_kstat_ref;		/* # paths aggregated, also a ref cnt */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
	kstat_t	*pi_kstat_iostats;	/* mdi:iopath statistic set */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
	kstat_t *pi_kstat_errstats;	/* error statistics */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
 * pathinfo error kstat
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
struct pi_errs {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
	struct kstat_named pi_softerrs;		/* "Soft" Error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
	struct kstat_named pi_harderrs;		/* "Hard" Error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
	struct kstat_named pi_transerrs;	/* Transport Errors */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
	struct kstat_named pi_icnt_busy;	/* Interconnect Busy */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
	struct kstat_named pi_icnt_errors;	/* Interconnect Errors */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
	struct kstat_named pi_phci_rsrc;	/* pHCI No Resources */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
	struct kstat_named pi_phci_localerr;	/* pHCI Local Errors */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
	struct kstat_named pi_phci_invstate;	/* pHCI Invalid State */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
	struct kstat_named pi_failedfrom;	/* Failover: Failed From */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
	struct kstat_named pi_failedto;		/* Failover: Failed To */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
 * increment an error counter
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
#define	MDI_PI_ERRSTAT(pip, x) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	if (MDI_PI((pip))->pi_kstats != NULL) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
		struct pi_errs *pep; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
		pep = MDI_PI(pip)->pi_kstats->pi_kstat_errstats->ks_data; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
		pep->x.value.ui32++; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
	} \
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
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
 * error codes which can be passed to MDI_PI_ERRSTAT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
#define	MDI_PI_SOFTERR	pi_softerrs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
#define	MDI_PI_HARDERR	pi_harderrs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
#define	MDI_PI_TRANSERR	pi_transerrs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
#define	MDI_PI_ICNTBUSY	pi_icnt_busy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
#define	MDI_PI_ICNTERR	pi_icnt_errors
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
#define	MDI_PI_PHCIRSRC	pi_phci_rsrc
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
#define	MDI_PI_PHCILOCL	pi_phci_localerr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
#define	MDI_PI_PHCIINVS	pi_phci_invstate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
#define	MDI_PI_FAILFROM	pi_failedfrom
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
#define	MDI_PI_FAILTO	pi_failedto
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
#define	MDI_PI(type)			((struct mdi_pathinfo *)(type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
#define	MDI_PI_LOCK(pip)		mutex_enter(&MDI_PI((pip))->pi_mutex)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
#define	MDI_PI_UNLOCK(pip)		mutex_exit(&MDI_PI((pip))->pi_mutex)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
#define	MDI_PI_HOLD(pip)		(++MDI_PI((pip))->pi_ref_cnt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
#define	MDI_PI_RELE(pip)		(--MDI_PI((pip))->pi_ref_cnt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
#define	MDI_EXT_STATE_CHANGE		0x10000000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
#define	MDI_DISABLE_OP			0x1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
#define	MDI_ENABLE_OP			0x2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
#define	MDI_BEFORE_STATE_CHANGE		0x4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
#define	MDI_AFTER_STATE_CHANGE		0x8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
#define	MDI_SYNC_FLAG			0x10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
#define	MDI_PI_STATE(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
	    (MDI_PI((pip))->pi_state & MDI_PATHINFO_STATE_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
#define	MDI_PI_OLD_STATE(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
	    (MDI_PI((pip))->pi_old_state & MDI_PATHINFO_STATE_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
#define	MDI_PI_EXT_STATE(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
		(MDI_PI((pip))->pi_state & MDI_PATHINFO_EXT_STATE_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
#define	MDI_PI_OLD_EXT_STATE(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
		(MDI_PI((pip))->pi_old_state & MDI_PATHINFO_EXT_STATE_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
#define	MDI_PI_SET_TRANSIENT(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
	    (MDI_PI(pip)->pi_state |= MDI_PATHINFO_STATE_TRANSIENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
#define	MDI_PI_CLEAR_TRANSIENT(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
	    (MDI_PI(pip)->pi_state &= ~MDI_PATHINFO_STATE_TRANSIENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
#define	MDI_PI_IS_TRANSIENT(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
	(MDI_PI(pip)->pi_state & MDI_PATHINFO_STATE_TRANSIENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
#define	MDI_PI_SET_USER_DISABLE(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
	(MDI_PI(pip)->pi_state |= MDI_PATHINFO_STATE_USER_DISABLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
#define	MDI_PI_SET_DRV_DISABLE(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
	(MDI_PI(pip)->pi_state |= MDI_PATHINFO_STATE_DRV_DISABLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
#define	MDI_PI_SET_DRV_DISABLE_TRANS(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
	(MDI_PI(pip)->pi_state |= MDI_PATHINFO_STATE_DRV_DISABLE_TRANSIENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
#define	MDI_PI_SET_USER_ENABLE(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
	(MDI_PI(pip)->pi_state &= ~MDI_PATHINFO_STATE_USER_DISABLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
#define	MDI_PI_SET_DRV_ENABLE(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
	(MDI_PI(pip)->pi_state &= ~MDI_PATHINFO_STATE_DRV_DISABLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
#define	MDI_PI_SET_DRV_ENABLE_TRANS(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
	(MDI_PI(pip)->pi_state &= ~MDI_PATHINFO_STATE_DRV_DISABLE_TRANSIENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
#define	MDI_PI_IS_USER_DISABLE(pip)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
	(MDI_PI(pip)->pi_state & MDI_PATHINFO_STATE_USER_DISABLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
#define	MDI_PI_IS_DRV_DISABLE(pip)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
	(MDI_PI(pip)->pi_state & MDI_PATHINFO_STATE_DRV_DISABLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
#define	MDI_PI_IS_DRV_DISABLE_TRANSIENT(pip)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
	(MDI_PI(pip)->pi_state & MDI_PATHINFO_STATE_DRV_DISABLE_TRANSIENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
#define	MDI_PI_IS_DISABLE(pip)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
	(MDI_PI_IS_USER_DISABLE(pip) || \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
	MDI_PI_IS_DRV_DISABLE(pip) || \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
	MDI_PI_IS_DRV_DISABLE_TRANSIENT(pip))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
#define	MDI_PI_IS_INIT(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
	    ((MDI_PI(pip)->pi_state & MDI_PATHINFO_STATE_MASK) == \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
		MDI_PATHINFO_STATE_INIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
#define	MDI_PI_IS_INITING(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
	    ((MDI_PI(pip)->pi_state & ~MDI_PATHINFO_EXT_STATE_MASK) == \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
		(MDI_PATHINFO_STATE_INIT | MDI_PATHINFO_STATE_TRANSIENT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
#define	MDI_PI_SET_INIT(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
	    (MDI_PI(pip)->pi_state = MDI_PATHINFO_STATE_INIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
#define	MDI_PI_SET_ONLINING(pip) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
	uint32_t	ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
	ext_state = MDI_PI(pip)->pi_state & MDI_PATHINFO_EXT_STATE_MASK; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
	MDI_PI(pip)->pi_old_state = MDI_PI_STATE(pip); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
	MDI_PI(pip)->pi_state = \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
	(MDI_PATHINFO_STATE_ONLINE | MDI_PATHINFO_STATE_TRANSIENT); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
	MDI_PI(pip)->pi_state |= ext_state; \
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
#define	MDI_PI_IS_ONLINING(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
	((MDI_PI(pip)->pi_state & ~MDI_PATHINFO_EXT_STATE_MASK) == \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
	(MDI_PATHINFO_STATE_ONLINE | MDI_PATHINFO_STATE_TRANSIENT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
#define	MDI_PI_SET_ONLINE(pip) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
	uint32_t	ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
	ext_state = MDI_PI(pip)->pi_state & MDI_PATHINFO_EXT_STATE_MASK; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
	MDI_PI(pip)->pi_state = MDI_PATHINFO_STATE_ONLINE; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
	MDI_PI(pip)->pi_state |= ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
#define	MDI_PI_IS_ONLINE(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
	((MDI_PI(pip)->pi_state & MDI_PATHINFO_STATE_MASK) == \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
	MDI_PATHINFO_STATE_ONLINE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
#define	MDI_PI_SET_OFFLINING(pip) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
	uint32_t	ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
	ext_state = MDI_PI(pip)->pi_state & MDI_PATHINFO_EXT_STATE_MASK; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
	MDI_PI(pip)->pi_old_state = MDI_PI_STATE(pip); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
	MDI_PI(pip)->pi_state = \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
	(MDI_PATHINFO_STATE_OFFLINE | MDI_PATHINFO_STATE_TRANSIENT); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
	MDI_PI(pip)->pi_state |= ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
#define	MDI_PI_IS_OFFLINING(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
	    ((MDI_PI(pip)->pi_state & ~MDI_PATHINFO_EXT_STATE_MASK) == \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
	    (MDI_PATHINFO_STATE_OFFLINE | MDI_PATHINFO_STATE_TRANSIENT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
#define	MDI_PI_SET_OFFLINE(pip) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
	uint32_t	ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
	ext_state = MDI_PI(pip)->pi_state & MDI_PATHINFO_EXT_STATE_MASK; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
	MDI_PI(pip)->pi_state = MDI_PATHINFO_STATE_OFFLINE; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
	MDI_PI(pip)->pi_state |= ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
#define	MDI_PI_IS_OFFLINE(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
	    ((MDI_PI(pip)->pi_state & MDI_PATHINFO_STATE_MASK) == \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
		MDI_PATHINFO_STATE_OFFLINE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
#define	MDI_PI_SET_STANDBYING(pip) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
	uint32_t	ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
	ext_state = MDI_PI(pip)->pi_state & MDI_PATHINFO_EXT_STATE_MASK; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
	MDI_PI(pip)->pi_old_state = MDI_PI_STATE(pip); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
	MDI_PI(pip)->pi_state = \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
	(MDI_PATHINFO_STATE_STANDBY | MDI_PATHINFO_STATE_TRANSIENT); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
	MDI_PI(pip)->pi_state |= ext_state; \
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
#define	MDI_PI_SET_STANDBY(pip) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
	uint32_t	ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
	ext_state = MDI_PI(pip)->pi_state & MDI_PATHINFO_EXT_STATE_MASK; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
	MDI_PI(pip)->pi_state = MDI_PATHINFO_STATE_STANDBY; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
	MDI_PI(pip)->pi_state |= ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
#define	MDI_PI_IS_STANDBY(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
	((MDI_PI(pip)->pi_state & MDI_PATHINFO_STATE_MASK) == \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
	MDI_PATHINFO_STATE_STANDBY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
#define	MDI_PI_SET_FAULTING(pip) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
	uint32_t	ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
	ext_state = MDI_PI(pip)->pi_state & MDI_PATHINFO_EXT_STATE_MASK; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
	MDI_PI(pip)->pi_old_state = MDI_PI_STATE(pip); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
	MDI_PI(pip)->pi_state = \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
	    (MDI_PATHINFO_STATE_FAULT | MDI_PATHINFO_STATE_TRANSIENT); \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
	MDI_PI(pip)->pi_state |= ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
#define	MDI_PI_SET_FAULT(pip) { \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
	uint32_t	ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
	ext_state = MDI_PI(pip)->pi_state & MDI_PATHINFO_EXT_STATE_MASK; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
	MDI_PI(pip)->pi_state = MDI_PATHINFO_STATE_FAULT; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
	MDI_PI(pip)->pi_state |= ext_state; \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
#define	MDI_PI_IS_FAULT(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
	((MDI_PI(pip)->pi_state & MDI_PATHINFO_STATE_MASK) == \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
	MDI_PATHINFO_STATE_FAULT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
#define	MDI_PI_IS_SUSPENDED(pip) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
	    ((MDI_PI(pip))->pi_phci->ph_flags & MDI_PHCI_FLAGS_SUSPEND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
/*
878
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   884
 * mdi_vhcache_client, mdi_vhcache_pathinfo, and mdi_vhcache_phci structures
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   885
 * hold the vhci to phci client mappings of the on-disk vhci busconfig cache.
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   886
 */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   887
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   888
/* phci structure of vhci cache */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   889
typedef struct mdi_vhcache_phci {
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   890
	char			*cphci_path;	/* phci path name */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   891
	uint32_t		cphci_id;	/* used when building nvlist */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   892
	mdi_phci_t		*cphci_phci;	/* pointer to actual phci */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   893
	struct mdi_vhcache_phci	*cphci_next;	/* next in vhci phci list */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   894
} mdi_vhcache_phci_t;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   895
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   896
/* pathinfo structure of vhci cache */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   897
typedef struct mdi_vhcache_pathinfo {
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   898
	char			*cpi_addr;	/* path address */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   899
	mdi_vhcache_phci_t	*cpi_cphci;	/* phci the path belongs to */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   900
	struct mdi_pathinfo	*cpi_pip;	/* ptr to actual pathinfo */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   901
	uint32_t		cpi_flags;	/* see below */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   902
	struct mdi_vhcache_pathinfo *cpi_next;	/* next path for the client */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   903
} mdi_vhcache_pathinfo_t;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   904
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   905
/*
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   906
 * cpi_flags
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   907
 *
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   908
 * MDI_CPI_HINT_PATH_DOES_NOT_EXIST - set when configuration of the path has
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   909
 * failed.
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   910
 */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   911
#define	MDI_CPI_HINT_PATH_DOES_NOT_EXIST	0x0001
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   912
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   913
/* client structure of vhci cache */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   914
typedef struct mdi_vhcache_client {
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   915
	char			*cct_name_addr;	/* client address */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   916
	mdi_vhcache_pathinfo_t	*cct_cpi_head;	/* client's path list head */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   917
	mdi_vhcache_pathinfo_t	*cct_cpi_tail;	/* client's path list tail */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   918
	struct mdi_vhcache_client *cct_next;	/* next in vhci client list */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   919
} mdi_vhcache_client_t;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   920
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   921
/* vhci cache structure - one for vhci instance */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   922
typedef struct mdi_vhci_cache {
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   923
	mdi_vhcache_phci_t	*vhcache_phci_head;	/* phci list head */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   924
	mdi_vhcache_phci_t	*vhcache_phci_tail;	/* phci list tail */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   925
	mdi_vhcache_client_t	*vhcache_client_head;	/* client list head */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   926
	mdi_vhcache_client_t	*vhcache_client_tail;	/* client list tail */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   927
	mod_hash_t		*vhcache_client_hash;	/* client hash */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   928
	int			vhcache_flags;		/* see below */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   929
	int64_t			vhcache_clean_time;	/* last clean time */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   930
	krwlock_t		vhcache_lock;		/* cache lock */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   931
} mdi_vhci_cache_t;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   932
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   933
/* vhcache_flags */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   934
#define	MDI_VHCI_CACHE_SETUP_DONE	0x0001	/* cache setup completed */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   935
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   936
typedef struct mdi_phci_driver_info {
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   937
	char			*phdriver_name;	/* name of the phci driver */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   938
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   939
	/* set to non zero if the phci driver supports root device */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   940
	int			phdriver_root_support;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   941
} mdi_phci_driver_info_t;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   942
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   943
/* vhci bus config structure - one for vhci instance */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   944
typedef struct mdi_vhci_config {
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   945
	char			*vhc_vhcache_filename;	/* on-disk file name */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   946
	mdi_vhci_cache_t	vhc_vhcache;		/* vhci cache */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   947
	mdi_phci_driver_info_t	*vhc_phci_driver_list;	/* ph drv info array */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   948
	int			vhc_nphci_drivers;	/* # of phci drivers */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   949
	kmutex_t		vhc_lock;		/* vhci config lock */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   950
	kcondvar_t		vhc_cv;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   951
	int			vhc_flags;		/* see below */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   952
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   953
	/* flush vhci cache when lbolt reaches vhc_flush_at_ticks */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   954
	clock_t			vhc_flush_at_ticks;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   955
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   956
	/*
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   957
	 * Head and tail of the client list whose paths are being configured
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   958
	 * asynchronously. vhc_acc_count is the number of clients on this list.
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   959
	 * vhc_acc_thrcount is the number threads running to configure
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   960
	 * the paths for these clients.
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   961
	 */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   962
	struct mdi_async_client_config *vhc_acc_list_head;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   963
	struct mdi_async_client_config *vhc_acc_list_tail;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   964
	int			vhc_acc_count;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   965
	int			vhc_acc_thrcount;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   966
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   967
	/* callback id - for flushing the cache during system shutdown */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   968
	callb_id_t		vhc_cbid;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   969
} mdi_vhci_config_t;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   970
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   971
/* vhc_flags */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   972
#define	MDI_VHC_SINGLE_THREADED		0x0001	/* config single threaded */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   973
#define	MDI_VHC_EXIT			0x0002	/* exit all config activity */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   974
#define	MDI_VHC_VHCACHE_DIRTY		0x0004	/* cache dirty */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   975
#define	MDI_VHC_VHCACHE_FLUSH_THREAD	0x0008	/* cache flush thead running */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   976
#define	MDI_VHC_VHCACHE_FLUSH_ERROR	0x0010	/* failed to flush cache */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   977
#define	MDI_VHC_READONLY_FS		0x0020	/* filesys is readonly */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   978
#define	MDI_VHC_BUILD_VHCI_CACHE_THREAD	0x0040	/* cachebuild thread running */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   979
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   980
typedef struct mdi_phys_path {
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   981
	char			*phys_path;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   982
	struct mdi_phys_path	*phys_path_next;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   983
} mdi_phys_path_t;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   984
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   985
/*
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   986
 * Lookup tokens are used to cache the result of the vhci cache client lookup
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   987
 * operations (to reduce the number of real lookup operations).
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   988
 */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   989
typedef struct mdi_vhcache_lookup_token {
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   990
	mdi_vhcache_client_t	*lt_cct;		/* vhcache client */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   991
	int64_t			lt_cct_lookup_time;	/* last lookup time */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   992
} mdi_vhcache_lookup_token_t;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   993
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   994
/* asynchronous configuration of client paths */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   995
typedef struct mdi_async_client_config {
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   996
	char			*acc_ct_name;	/* client name */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   997
	char			*acc_ct_addr;	/* client address */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   998
	mdi_phys_path_t		*acc_phclient_path_list_head;	/* path head */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
   999
	mdi_vhcache_lookup_token_t acc_token;	/* lookup token */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
  1000
	struct mdi_async_client_config *acc_next; /* next in vhci acc list */
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
  1001
} mdi_async_client_config_t;
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
  1002
964ddd439490 PSARC 2005/583 VHCI Driven Device Enumeration
ramat
parents: 0
diff changeset
  1003
/*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
 * vHCI driver instance registration/unregistration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
 * mdi_vhci_register() is called by a vHCI driver to register itself as the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
 * manager of devices from a particular 'class'.  This should be called from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
 * attach(9e).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
 * mdi_vhci_unregister() is called from detach(9E) to unregister a vHCI
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
 * instance from the framework.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
int		mdi_vhci_register(char *, dev_info_t *, mdi_vhci_ops_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
int		mdi_vhci_unregister(dev_info_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
 * Utility functions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
int		mdi_phci_get_path_count(dev_info_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
dev_info_t	*mdi_phci_path2devinfo(dev_info_t *, caddr_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
 * Path Selection Functions:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
 * mdi_select_path() is called by a vHCI driver to select to which path an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
 * I/O request should be routed.  The caller passes the 'buf' structure as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
 * one of the parameters.  The mpxio framework uses the buf's contents to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
 * maintain per path statistics (total I/O size / count pending).  If more
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
 * than one online path is available, the framework automatically selects
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
 * a suitable one.  If a failover operation is active for this client device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
 * the call fails, returning MDI_BUSY.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
 * By default this function returns a suitable path in the 'online' state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
 * based on the current load balancing policy.  Currently we support
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
 * LOAD_BALANCE_NONE (Previously selected online path will continue to be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
 * used as long as the path is usable) and LOAD_BALANCE_RR (Online paths
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
 * will be selected in a round robin fashion).  The load balancing scheme
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
 * can be configured in the vHCI driver's configuration file (driver.conf).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
 * vHCI drivers may override this default behaviour by specifying appropriate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
 * flags.  If start_pip is specified (non NULL), it is used as the routine's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
 * starting point; it starts walking from there to find the next appropriate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
 * path.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
 * The following values for 'flags' are currently defined:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
 * 	MDI_SELECT_ONLINE_PATH: select an ONLINE path
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
 *	MDI_SELECT_STANDBY_PATH: select a STANDBY path
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
 * The selected paths are returned in a held state (ref_cnt) and caller should
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
 * release the hold by calling mdi_rele_path() at the end of operation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
int		mdi_select_path(dev_info_t *, struct buf *, int,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
		    mdi_pathinfo_t *, mdi_pathinfo_t **);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
void		mdi_hold_path(mdi_pathinfo_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
void		mdi_rele_path(mdi_pathinfo_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
int		mdi_set_lb_policy(dev_info_t *, client_lb_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
int		mdi_set_lb_region_size(dev_info_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
client_lb_t	mdi_get_lb_policy(dev_info_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
 * flags for mdi_select_path() routine
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
#define	MDI_SELECT_ONLINE_PATH		0x0001
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
#define	MDI_SELECT_STANDBY_PATH		0x0002
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
 * MDI client device utility functions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
int		mdi_client_get_path_count(dev_info_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
dev_info_t	*mdi_client_path2devinfo(dev_info_t *, caddr_t);
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
 * Failover:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
 * The vHCI driver calls mdi_failover() to initiate a failover operation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
 * mdi_failover() calls back into the vHCI driver's vo_failover()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
 * entry point to perform the actual failover operation.  The reason
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
 * for requiring the vHCI driver to initiate failover by calling
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
 * mdi_failover(), instead of directly executing vo_failover() itself,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
 * is to ensure that the mdi framework can keep track of the client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
 * state properly.  Additionally, mdi_failover() provides as a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
 * convenience the option of performing the failover operation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
 * synchronously or asynchronously
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
 * Upon successful completion of the failover operation, the paths that were
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
 * previously ONLINE will be in the STANDBY state, and the newly activated
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
 * paths will be in the ONLINE state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
 * The flags modifier determines whether the activation is done synchronously
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
int mdi_failover(dev_info_t *, dev_info_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
 * Client device failover mode of operation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
#define	MDI_FAILOVER_SYNC	1	/* Syncronous Failover		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
#define	MDI_FAILOVER_ASYNC	2	/* Asyncronous Failover		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
 * mdi_pathinfo node state change functions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
void mdi_pi_kstat_iosupdate(mdi_pathinfo_t *, struct buf *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
 * mdi_pathinfo node extended state change functions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
int mdi_pi_get_state2(mdi_pathinfo_t *, mdi_pathinfo_state_t *, uint32_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
int mdi_pi_get_preferred(mdi_pathinfo_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
 * mdi_pathinfo node member functions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
void *mdi_pi_get_client_private(mdi_pathinfo_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
void mdi_pi_set_client_private(mdi_pathinfo_t *, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
void mdi_pi_set_state(mdi_pathinfo_t *, mdi_pathinfo_state_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
void mdi_pi_set_preferred(mdi_pathinfo_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
/* get/set vhci private data */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
void *mdi_client_get_vhci_private(dev_info_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
void mdi_client_set_vhci_private(dev_info_t *, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
void *mdi_phci_get_vhci_private(dev_info_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
void mdi_phci_set_vhci_private(dev_info_t *, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
void *mdi_pi_get_vhci_private(mdi_pathinfo_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
void mdi_pi_set_vhci_private(mdi_pathinfo_t *, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
 * mdi_pathinfo Property utilities
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
int mdi_prop_size(mdi_pathinfo_t *, size_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
int mdi_prop_pack(mdi_pathinfo_t *, char **, uint_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
/* obsolete interface, to be removed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
void mdi_get_next_path(dev_info_t *, mdi_pathinfo_t *, mdi_pathinfo_t **);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
int mdi_get_component_type(dev_info_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
#endif	/* _KERNEL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
#endif	/* _SYS_MDI_IMPLDEFS_H */