1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2002 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_RMC_COMM_DRVINTF_H 28 #define _SYS_RMC_COMM_DRVINTF_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 33 #include <sys/rmc_comm_hproto.h> 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 /* 40 * this struct is used by client programs to request message services: 41 */ 42 typedef struct rmc_comm_msg { 43 44 uint8_t msg_type; /* message type */ 45 int16_t msg_len; /* size of the message buffer */ 46 int16_t msg_bytes; /* number of bytes returned */ 47 caddr_t msg_buf; /* message buffer */ 48 49 } rmc_comm_msg_t; 50 51 52 /* list of error codes for RMC comm */ 53 54 #define RCNOERR (0) /* cmd sent, reply/ACK received */ 55 #define RCENOSOFTSTATE (-1) /* invalid/NULL soft state structure */ 56 #define RCENODATALINK (-2) /* data link down */ 57 #define RCENOMEM (-3) /* no memory */ 58 #define RCECANTRESEND (-4) /* resend failed */ 59 #define RCEMAXRETRIES (-5) /* maximum number of retries exceeded */ 60 #define RCETIMEOUT (-6) /* timeout error */ 61 #define RCEINVCMD (-7) /* invalid data protocol command */ 62 #define RCEINVARG (-8) /* invalid argument(s) */ 63 #define RCECANTREGINTR (-9) /* interrupt handler registration failure */ 64 #define RCEALREADYREG (-10) /* interrupt handler already registered */ 65 #define RCEREPTOOBIG (-11) /* reply message too big */ 66 #define RCEGENERIC (-15) /* generic error */ 67 68 /* 69 * possible value for the 'state' variable provided by the driver 70 * (registration for an asynchronous message notification - 71 * see rmc_comm_reg_intr). The state variable tells whether the driver 72 * interrupt handler is currently processing an asynchronous notification or 73 * not. 74 */ 75 76 #define RMC_COMM_INTR_IDLE 0x01 77 #define RMC_COMM_INTR_RUNNING 0x02 78 79 80 /* 81 * structure used to store a request (only one per time!) that is delivered 82 * later. Some leaf driver (TOD for instance) cannot wait for the completion 83 * of the trasmission of a request message so they calls a specific interface 84 * (rmc_comm_request_nowait) which stores the request in this structure and 85 * signals a thread to deliver the request asynchronously. 86 */ 87 typedef struct rmc_comm_drvintf_state { 88 89 kt_did_t dreq_tid; 90 kmutex_t dreq_mutex[1]; 91 kcondvar_t dreq_sig_cv[1]; 92 uint8_t dreq_state; 93 rmc_comm_msg_t dreq_request; 94 char dreq_request_buf[ DP_MAX_MSGLEN ]; 95 96 } rmc_comm_drvintf_state_t; 97 98 /* 99 * possible value for dreq_state field 100 */ 101 enum rmc_comm_dreq_state { 102 RMC_COMM_DREQ_ST_NOTSTARTED = 0, 103 RMC_COMM_DREQ_ST_READY, 104 RMC_COMM_DREQ_ST_WAIT, 105 RMC_COMM_DREQ_ST_PROCESS, 106 RMC_COMM_DREQ_ST_EXIT 107 }; 108 109 /* 110 * default timeout value for requests sent from the thread 111 */ 112 #define RMC_COMM_DREQ_DEFAULT_TIME 10000 113 114 /* 115 * flag which tells if a request has to be sent even if a pending request is 116 * in process. This flag must only be used when trying to send a request in 117 * critical condition (while the system is shutting down for instance and the 118 * CPU signature has to be sent). Otherwise, the request is stored in a 119 * temporary location and delivered by a thread. 120 */ 121 122 #define RMC_COMM_DREQ_URGENT 0x01 123 124 125 /* function prototypes (interface to the drivers) */ 126 127 int rmc_comm_request_response(rmc_comm_msg_t *, rmc_comm_msg_t *, uint32_t); 128 int rmc_comm_request_nowait(rmc_comm_msg_t *, uint8_t); 129 int rmc_comm_request_response_bp(rmc_comm_msg_t *, rmc_comm_msg_t *, uint32_t); 130 int rmc_comm_reg_intr(uint8_t, rmc_comm_intrfunc_t, rmc_comm_msg_t *, uint_t *, 131 kmutex_t *); 132 int rmc_comm_unreg_intr(uint8_t, rmc_comm_intrfunc_t); 133 int rmc_comm_send_srecord_bp(caddr_t, int, rmc_comm_msg_t *, uint32_t); 134 135 #ifdef __cplusplus 136 } 137 #endif 138 139 #endif /* _SYS_RMC_COMM_DRVINTF_H */ 140