root/usr/src/uts/sun4u/sys/rmc_comm_drvintf.h
/*
 * 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 */