summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4u/sys/rmc_comm_drvintf.h
blob: 76d4ccde779cbafd0ed5945e5c90a4c3ec389af5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2002 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_RMC_COMM_DRVINTF_H
#define	_SYS_RMC_COMM_DRVINTF_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"


#include <sys/rmc_comm_hproto.h>

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * this struct is used by client programs to request message services:
 */
typedef struct rmc_comm_msg {

	uint8_t	msg_type;	/* message type */
	int16_t	msg_len;	/* size of the message buffer */
	int16_t	msg_bytes;	/* number of bytes returned */
	caddr_t	msg_buf;	/* message buffer */

} rmc_comm_msg_t;


/* list of error codes for RMC comm */

#define	RCNOERR		(0)	/* cmd sent, reply/ACK received */
#define	RCENOSOFTSTATE	(-1)	/* invalid/NULL soft state structure */
#define	RCENODATALINK	(-2)	/* data link down */
#define	RCENOMEM	(-3)	/* no memory */
#define	RCECANTRESEND	(-4)	/* resend failed */
#define	RCEMAXRETRIES	(-5)	/* maximum number of retries exceeded */
#define	RCETIMEOUT	(-6)	/* timeout error */
#define	RCEINVCMD	(-7)	/* invalid data protocol command */
#define	RCEINVARG	(-8)	/* invalid argument(s) */
#define	RCECANTREGINTR	(-9)	/* interrupt handler registration failure */
#define	RCEALREADYREG	(-10)	/* interrupt handler already registered */
#define	RCEREPTOOBIG	(-11)	/* reply message too big */
#define	RCEGENERIC	(-15)	/* generic error */

/*
 * possible value for the 'state' variable provided by the driver
 * (registration for an asynchronous message notification -
 * see rmc_comm_reg_intr). The state variable tells whether the driver
 * interrupt handler is currently processing an asynchronous notification or
 * not.
 */

#define	RMC_COMM_INTR_IDLE	0x01
#define	RMC_COMM_INTR_RUNNING	0x02


/*
 * structure used to store a request (only one per time!) that is delivered
 * later. Some leaf driver (TOD for instance) cannot wait for the completion
 * of the trasmission of a request message so they calls a specific interface
 * (rmc_comm_request_nowait) which stores the request in this structure and
 * signals a thread to deliver the request asynchronously.
 */
typedef struct rmc_comm_drvintf_state {

	kt_did_t	dreq_tid;
	kmutex_t	dreq_mutex[1];
	kcondvar_t	dreq_sig_cv[1];
	uint8_t		dreq_state;
	rmc_comm_msg_t	dreq_request;
	char		dreq_request_buf[ DP_MAX_MSGLEN ];

} rmc_comm_drvintf_state_t;

/*
 * possible value for dreq_state field
 */
enum rmc_comm_dreq_state {
	RMC_COMM_DREQ_ST_NOTSTARTED = 0,
	RMC_COMM_DREQ_ST_READY,
	RMC_COMM_DREQ_ST_WAIT,
	RMC_COMM_DREQ_ST_PROCESS,
	RMC_COMM_DREQ_ST_EXIT
};

/*
 * default timeout value for requests sent from the thread
 */
#define	RMC_COMM_DREQ_DEFAULT_TIME	10000

/*
 * flag which tells if a request has to be sent even if a pending request is
 * in process. This flag must only be used when trying to send a request in
 * critical condition (while the system is shutting down for instance and the
 * CPU signature has to be sent). Otherwise, the request is stored in a
 * temporary location and delivered by a thread.
 */

#define	RMC_COMM_DREQ_URGENT		0x01


/* function prototypes (interface to the drivers) */

int rmc_comm_request_response(rmc_comm_msg_t *, rmc_comm_msg_t *, uint32_t);
int rmc_comm_request_nowait(rmc_comm_msg_t *, uint8_t);
int rmc_comm_request_response_bp(rmc_comm_msg_t *, rmc_comm_msg_t *, uint32_t);
int rmc_comm_reg_intr(uint8_t, rmc_comm_intrfunc_t, rmc_comm_msg_t *, uint_t *,
			kmutex_t *);
int rmc_comm_unreg_intr(uint8_t, rmc_comm_intrfunc_t);
int rmc_comm_send_srecord_bp(caddr_t, int, rmc_comm_msg_t *, uint32_t);

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_RMC_COMM_DRVINTF_H */