17c478bd9Sstevel@tonic-gate /* 2*8d96d5b3Sjroberts * CDDL HEADER START 3*8d96d5b3Sjroberts * 4*8d96d5b3Sjroberts * The contents of this file are subject to the terms of the 5*8d96d5b3Sjroberts * Common Development and Distribution License (the "License"). 6*8d96d5b3Sjroberts * You may not use this file except in compliance with the License. 7*8d96d5b3Sjroberts * 8*8d96d5b3Sjroberts * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*8d96d5b3Sjroberts * or http://www.opensolaris.org/os/licensing. 10*8d96d5b3Sjroberts * See the License for the specific language governing permissions 11*8d96d5b3Sjroberts * and limitations under the License. 12*8d96d5b3Sjroberts * 13*8d96d5b3Sjroberts * When distributing Covered Code, include this CDDL HEADER in each 14*8d96d5b3Sjroberts * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*8d96d5b3Sjroberts * If applicable, add the following below this CDDL HEADER, with the 16*8d96d5b3Sjroberts * fields enclosed by brackets "[]" replaced with your own identifying 17*8d96d5b3Sjroberts * information: Portions Copyright [yyyy] [name of copyright owner] 18*8d96d5b3Sjroberts * 19*8d96d5b3Sjroberts * CDDL HEADER END 20*8d96d5b3Sjroberts */ 21*8d96d5b3Sjroberts 22*8d96d5b3Sjroberts /* 23*8d96d5b3Sjroberts * Copyright 2002 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate #ifndef _SYS_RMC_COMM_DRVINTF_H 287c478bd9Sstevel@tonic-gate #define _SYS_RMC_COMM_DRVINTF_H 297c478bd9Sstevel@tonic-gate 307c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 317c478bd9Sstevel@tonic-gate 327c478bd9Sstevel@tonic-gate 337c478bd9Sstevel@tonic-gate #include <sys/rmc_comm_hproto.h> 347c478bd9Sstevel@tonic-gate 357c478bd9Sstevel@tonic-gate #ifdef __cplusplus 367c478bd9Sstevel@tonic-gate extern "C" { 377c478bd9Sstevel@tonic-gate #endif 387c478bd9Sstevel@tonic-gate 397c478bd9Sstevel@tonic-gate /* 407c478bd9Sstevel@tonic-gate * this struct is used by client programs to request message services: 417c478bd9Sstevel@tonic-gate */ 427c478bd9Sstevel@tonic-gate typedef struct rmc_comm_msg { 437c478bd9Sstevel@tonic-gate 447c478bd9Sstevel@tonic-gate uint8_t msg_type; /* message type */ 457c478bd9Sstevel@tonic-gate int16_t msg_len; /* size of the message buffer */ 467c478bd9Sstevel@tonic-gate int16_t msg_bytes; /* number of bytes returned */ 477c478bd9Sstevel@tonic-gate caddr_t msg_buf; /* message buffer */ 487c478bd9Sstevel@tonic-gate 497c478bd9Sstevel@tonic-gate } rmc_comm_msg_t; 507c478bd9Sstevel@tonic-gate 517c478bd9Sstevel@tonic-gate 527c478bd9Sstevel@tonic-gate /* list of error codes for RMC comm */ 537c478bd9Sstevel@tonic-gate 547c478bd9Sstevel@tonic-gate #define RCNOERR (0) /* cmd sent, reply/ACK received */ 557c478bd9Sstevel@tonic-gate #define RCENOSOFTSTATE (-1) /* invalid/NULL soft state structure */ 567c478bd9Sstevel@tonic-gate #define RCENODATALINK (-2) /* data link down */ 577c478bd9Sstevel@tonic-gate #define RCENOMEM (-3) /* no memory */ 587c478bd9Sstevel@tonic-gate #define RCECANTRESEND (-4) /* resend failed */ 597c478bd9Sstevel@tonic-gate #define RCEMAXRETRIES (-5) /* maximum number of retries exceeded */ 607c478bd9Sstevel@tonic-gate #define RCETIMEOUT (-6) /* timeout error */ 617c478bd9Sstevel@tonic-gate #define RCEINVCMD (-7) /* invalid data protocol command */ 627c478bd9Sstevel@tonic-gate #define RCEINVARG (-8) /* invalid argument(s) */ 637c478bd9Sstevel@tonic-gate #define RCECANTREGINTR (-9) /* interrupt handler registration failure */ 647c478bd9Sstevel@tonic-gate #define RCEALREADYREG (-10) /* interrupt handler already registered */ 657c478bd9Sstevel@tonic-gate #define RCEREPTOOBIG (-11) /* reply message too big */ 667c478bd9Sstevel@tonic-gate #define RCEGENERIC (-15) /* generic error */ 677c478bd9Sstevel@tonic-gate 687c478bd9Sstevel@tonic-gate /* 697c478bd9Sstevel@tonic-gate * possible value for the 'state' variable provided by the driver 707c478bd9Sstevel@tonic-gate * (registration for an asynchronous message notification - 717c478bd9Sstevel@tonic-gate * see rmc_comm_reg_intr). The state variable tells whether the driver 727c478bd9Sstevel@tonic-gate * interrupt handler is currently processing an asynchronous notification or 737c478bd9Sstevel@tonic-gate * not. 747c478bd9Sstevel@tonic-gate */ 757c478bd9Sstevel@tonic-gate 767c478bd9Sstevel@tonic-gate #define RMC_COMM_INTR_IDLE 0x01 777c478bd9Sstevel@tonic-gate #define RMC_COMM_INTR_RUNNING 0x02 787c478bd9Sstevel@tonic-gate 797c478bd9Sstevel@tonic-gate 807c478bd9Sstevel@tonic-gate /* 817c478bd9Sstevel@tonic-gate * structure used to store a request (only one per time!) that is delivered 827c478bd9Sstevel@tonic-gate * later. Some leaf driver (TOD for instance) cannot wait for the completion 837c478bd9Sstevel@tonic-gate * of the trasmission of a request message so they calls a specific interface 847c478bd9Sstevel@tonic-gate * (rmc_comm_request_nowait) which stores the request in this structure and 857c478bd9Sstevel@tonic-gate * signals a thread to deliver the request asynchronously. 867c478bd9Sstevel@tonic-gate */ 877c478bd9Sstevel@tonic-gate typedef struct rmc_comm_drvintf_state { 887c478bd9Sstevel@tonic-gate 897c478bd9Sstevel@tonic-gate kt_did_t dreq_tid; 907c478bd9Sstevel@tonic-gate kmutex_t dreq_mutex[1]; 917c478bd9Sstevel@tonic-gate kcondvar_t dreq_sig_cv[1]; 927c478bd9Sstevel@tonic-gate uint8_t dreq_state; 937c478bd9Sstevel@tonic-gate rmc_comm_msg_t dreq_request; 947c478bd9Sstevel@tonic-gate char dreq_request_buf[ DP_MAX_MSGLEN ]; 957c478bd9Sstevel@tonic-gate 967c478bd9Sstevel@tonic-gate } rmc_comm_drvintf_state_t; 977c478bd9Sstevel@tonic-gate 987c478bd9Sstevel@tonic-gate /* 997c478bd9Sstevel@tonic-gate * possible value for dreq_state field 1007c478bd9Sstevel@tonic-gate */ 1017c478bd9Sstevel@tonic-gate enum rmc_comm_dreq_state { 1027c478bd9Sstevel@tonic-gate RMC_COMM_DREQ_ST_NOTSTARTED = 0, 1037c478bd9Sstevel@tonic-gate RMC_COMM_DREQ_ST_READY, 1047c478bd9Sstevel@tonic-gate RMC_COMM_DREQ_ST_WAIT, 1057c478bd9Sstevel@tonic-gate RMC_COMM_DREQ_ST_PROCESS, 1067c478bd9Sstevel@tonic-gate RMC_COMM_DREQ_ST_EXIT 1077c478bd9Sstevel@tonic-gate }; 1087c478bd9Sstevel@tonic-gate 1097c478bd9Sstevel@tonic-gate /* 1107c478bd9Sstevel@tonic-gate * default timeout value for requests sent from the thread 1117c478bd9Sstevel@tonic-gate */ 1127c478bd9Sstevel@tonic-gate #define RMC_COMM_DREQ_DEFAULT_TIME 10000 1137c478bd9Sstevel@tonic-gate 1147c478bd9Sstevel@tonic-gate /* 1157c478bd9Sstevel@tonic-gate * flag which tells if a request has to be sent even if a pending request is 1167c478bd9Sstevel@tonic-gate * in process. This flag must only be used when trying to send a request in 1177c478bd9Sstevel@tonic-gate * critical condition (while the system is shutting down for instance and the 1187c478bd9Sstevel@tonic-gate * CPU signature has to be sent). Otherwise, the request is stored in a 1197c478bd9Sstevel@tonic-gate * temporary location and delivered by a thread. 1207c478bd9Sstevel@tonic-gate */ 1217c478bd9Sstevel@tonic-gate 1227c478bd9Sstevel@tonic-gate #define RMC_COMM_DREQ_URGENT 0x01 1237c478bd9Sstevel@tonic-gate 1247c478bd9Sstevel@tonic-gate 1257c478bd9Sstevel@tonic-gate /* function prototypes (interface to the drivers) */ 1267c478bd9Sstevel@tonic-gate 1277c478bd9Sstevel@tonic-gate int rmc_comm_request_response(rmc_comm_msg_t *, rmc_comm_msg_t *, uint32_t); 1287c478bd9Sstevel@tonic-gate int rmc_comm_request_nowait(rmc_comm_msg_t *, uint8_t); 1297c478bd9Sstevel@tonic-gate int rmc_comm_request_response_bp(rmc_comm_msg_t *, rmc_comm_msg_t *, uint32_t); 1307c478bd9Sstevel@tonic-gate int rmc_comm_reg_intr(uint8_t, rmc_comm_intrfunc_t, rmc_comm_msg_t *, uint_t *, 1317c478bd9Sstevel@tonic-gate kmutex_t *); 1327c478bd9Sstevel@tonic-gate int rmc_comm_unreg_intr(uint8_t, rmc_comm_intrfunc_t); 1337c478bd9Sstevel@tonic-gate int rmc_comm_send_srecord_bp(caddr_t, int, rmc_comm_msg_t *, uint32_t); 1347c478bd9Sstevel@tonic-gate 1357c478bd9Sstevel@tonic-gate #ifdef __cplusplus 1367c478bd9Sstevel@tonic-gate } 1377c478bd9Sstevel@tonic-gate #endif 1387c478bd9Sstevel@tonic-gate 1397c478bd9Sstevel@tonic-gate #endif /* _SYS_RMC_COMM_DRVINTF_H */ 140