usr/src/uts/sun4u/opl/io/oplkmdrv.c
author Zach Kissel <Zachary.Kissel@Sun.COM>
Mon, 03 Aug 2009 16:11:09 -0400
changeset 10248 7c0b1a92a9bf
parent 8459 5b8974f1a0ce
child 11066 cebb50cbe4f9
permissions -rw-r--r--
6757244 okm_info assumes dip is valid
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1772
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
     1
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
     2
 * CDDL HEADER START
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
     3
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
     7
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    11
 * and limitations under the License.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    12
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    18
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    19
 * CDDL HEADER END
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    20
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    21
/*
10248
7c0b1a92a9bf 6757244 okm_info assumes dip is valid
Zach Kissel <Zachary.Kissel@Sun.COM>
parents: 8459
diff changeset
    22
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
1772
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    23
 * Use is subject to license terms.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    24
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    25
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    26
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    27
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    28
 * OPL IPSec Key Management Driver.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    29
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    30
 * This driver runs on a OPL Domain. It processes requests received
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    31
 * from the OPL Service Processor (SP) via mailbox message. It passes
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    32
 * these requests to the sckmd daemon by means of an /ioctl interface.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    33
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    34
 * Requests received from the SP consist of IPsec security associations
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    35
 * (SAs) needed to secure the communication between SC and Domain daemons
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    36
 * communicating using DSCP.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    37
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    38
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    39
#include <sys/types.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    40
#include <sys/cmn_err.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    41
#include <sys/kmem.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    42
#include <sys/errno.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    43
#include <sys/file.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    44
#include <sys/open.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    45
#include <sys/stat.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    46
#include <sys/conf.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    47
#include <sys/ddi.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    48
#include <sys/cmn_err.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    49
#include <sys/sunddi.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    50
#include <sys/sunndi.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    51
#include <sys/ddi_impldefs.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    52
#include <sys/ndi_impldefs.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    53
#include <sys/modctl.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    54
#include <sys/disp.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    55
#include <sys/note.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    56
#include <sys/byteorder.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    57
#include <sys/sdt.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    58
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    59
#include <sys/scfd/scfdscpif.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    60
#include <sys/oplkm_msg.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    61
#include <sys/sckm_io.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    62
#include <sys/oplkm.h>
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    63
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    64
#define	OKM_NODENAME	"oplkmdrv"		/* Node name */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    65
#define	OKM_TARGET_ID	0			/* Target ID */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    66
#define	OKM_SM_TOUT	5000			/* small timeout (5msec) */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    67
#define	OKM_LG_TOUT	50000			/* large timeout (50msec) */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    68
#define	OKM_MB_TOUT	10000000		/* Mailbox timeout (10sec) */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    69
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    70
okms_t okms_global;				/* Global instance structure */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    71
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    72
#ifdef DEBUG
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    73
uint32_t okm_debug = DBG_WARN;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    74
#endif
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    75
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    76
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    77
 * Prototypes for the module related functions.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    78
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    79
int okm_attach(dev_info_t *devi, ddi_attach_cmd_t cmd);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    80
int okm_detach(dev_info_t *devi, ddi_detach_cmd_t cmd);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    81
int okm_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    82
int okm_open(dev_t *devp, int flag, int otyp, struct cred *cred);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    83
int okm_close(dev_t dev, int flag, int otyp, struct cred *cred);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    84
int okm_ioctl(dev_t dev, int cmd, intptr_t data, int flag,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    85
		cred_t *cred, int *rvalp);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    86
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    87
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    88
 * Prototypes for the internal functions.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    89
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    90
int okm_get_req(okms_t *okmsp, sckm_ioctl_getreq_t *ireqp,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    91
    intptr_t data, int flag);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    92
int okm_process_req(okms_t *okmsp, okm_req_hdr_t *reqp, uint32_t len,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    93
    sckm_ioctl_getreq_t *ireqp, intptr_t data, int flag);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    94
int okm_process_status(okms_t *okmsp, sckm_ioctl_status_t *ireply);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    95
void okm_event_handler(scf_event_t event, void *arg);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    96
int okm_send_reply(okms_t *okmsp, uint32_t transid, uint32_t status,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    97
    uint32_t sadb_err, uint32_t sadb_ver);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    98
int block_until_ready(okms_t *okmsp);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
    99
static int okm_copyin_ioctl_getreq(intptr_t userarg,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   100
    sckm_ioctl_getreq_t *driverarg, int flag);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   101
static int okm_copyout_ioctl_getreq(sckm_ioctl_getreq_t *driverarg,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   102
    intptr_t userarg, int flag);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   103
static void okm_cleanup(okms_t *okmsp);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   104
static int okm_mbox_init(okms_t *okmsp);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   105
static void okm_mbox_fini(okms_t *okmsp);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   106
static clock_t okm_timeout_val(int error);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   107
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   108
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   109
struct cb_ops okm_cb_ops = {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   110
	okm_open,		/* open */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   111
	okm_close,		/* close */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   112
	nodev,			/* strategy */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   113
	nodev,			/* print */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   114
	nodev,			/* dump */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   115
	nodev,			/* read */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   116
	nodev,			/* write */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   117
	okm_ioctl,		/* ioctl */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   118
	nodev,			/* devmap */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   119
	nodev,			/* mmap */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   120
	nodev,			/* segmap */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   121
	nochpoll,		/* poll */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   122
	ddi_prop_op,		/* prop_op */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   123
	0,			/* streamtab  */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   124
	D_NEW | D_MP		/* Driver compatibility flag */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   125
};
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   126
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   127
struct dev_ops okm_ops = {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   128
	DEVO_REV,		/* devo_rev, */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   129
	0,			/* refcnt  */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   130
	okm_info,		/* get_dev_info */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   131
	nulldev,		/* identify */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   132
	nulldev,		/* probe */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   133
	okm_attach,		/* attach */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   134
	okm_detach,		/* detach */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   135
	nodev,			/* reset */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   136
	&okm_cb_ops,		/* driver operations */
7656
2621e50fdf4a PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents: 2126
diff changeset
   137
	(struct bus_ops *)0,	/* no bus operations */
2621e50fdf4a PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents: 2126
diff changeset
   138
	NULL,			/* power */
2621e50fdf4a PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents: 2126
diff changeset
   139
	ddi_quiesce_not_needed,		/* quiesce */
1772
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   140
};
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   141
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   142
struct modldrv modldrv = {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   143
	&mod_driverops,
7656
2621e50fdf4a PSARC 2008/382 Fast Reboot
Sherry Moore <Sherry.Moore@Sun.COM>
parents: 2126
diff changeset
   144
	"OPL Key Management Driver",
1772
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   145
	&okm_ops,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   146
};
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   147
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   148
struct modlinkage modlinkage = {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   149
	MODREV_1,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   150
	&modldrv,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   151
	NULL
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   152
};
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   153
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   154
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   155
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   156
 * _init - Module's init routine.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   157
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   158
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   159
_init(void)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   160
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   161
	int ret;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   162
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   163
	if ((ret = mod_install(&modlinkage)) != 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   164
		cmn_err(CE_WARN, "mod_install failed, error = %d", ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   165
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   166
	return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   167
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   168
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   169
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   170
 * _fini - Module's fini routine.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   171
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   172
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   173
_fini(void)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   174
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   175
	int ret;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   176
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   177
	if ((ret = mod_remove(&modlinkage)) != 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   178
		return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   179
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   180
	return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   181
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   182
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   183
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   184
 * _info - Module's info routine.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   185
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   186
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   187
_info(struct modinfo *modinfop)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   188
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   189
	return (mod_info(&modlinkage, modinfop));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   190
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   191
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   192
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   193
 * okm_attach - Module's attach routine.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   194
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   195
 * Description:	Initializes the modules state structure and create
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   196
 *		the minor device node.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   197
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   198
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   199
okm_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   200
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   201
	int instance;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   202
	okms_t *okmsp = &okms_global;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   203
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   204
	instance = ddi_get_instance(dip);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   205
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   206
	/* Only one instance is supported.  */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   207
	if (instance != 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   208
		return (DDI_FAILURE);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   209
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   210
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   211
	if (cmd != DDI_ATTACH) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   212
		return (DDI_FAILURE);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   213
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   214
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   215
	okmsp->km_dip = dip;
8459
5b8974f1a0ce 6717523 ddi_binding_name/ddi_get_name use problematic
Jerry Gilliam <Jerry.Gilliam@Sun.COM>
parents: 7656
diff changeset
   216
	okmsp->km_major = ddi_driver_major(dip);
1772
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   217
	okmsp->km_inst = instance;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   218
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   219
	/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   220
	 * Get an interrupt block cookie corresponding to the
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   221
	 * interrupt priority of the event handler.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   222
	 * Assert that the event priority is not redefined to
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   223
	 * some other priority.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   224
	 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   225
	/* LINTED */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   226
	ASSERT(SCF_EVENT_PRI == DDI_SOFTINT_LOW);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   227
	if (ddi_get_soft_iblock_cookie(dip, SCF_EVENT_PRI,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   228
	    &okmsp->km_ibcookie) != DDI_SUCCESS) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   229
		cmn_err(CE_WARN, "ddi_get_soft_iblock_cookie failed.");
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   230
		return (DDI_FAILURE);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   231
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   232
	mutex_init(&okmsp->km_lock, NULL, MUTEX_DRIVER,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   233
	    (void *)okmsp->km_ibcookie);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   234
	okmsp->km_clean |= OKM_CLEAN_LOCK;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   235
	cv_init(&okmsp->km_wait, NULL, CV_DRIVER, NULL);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   236
	okmsp->km_clean |= OKM_CLEAN_CV;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   237
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   238
	/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   239
	 * set clean_node ahead as remove_node has to be called even
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   240
	 * if create node fails.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   241
	 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   242
	okmsp->km_clean |= OKM_CLEAN_NODE;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   243
	if (ddi_create_minor_node(dip, OKM_NODENAME, S_IFCHR,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   244
	    instance, NULL, NULL) == DDI_FAILURE) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   245
		cmn_err(CE_WARN, "Device node creation failed");
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   246
		okm_cleanup(okmsp);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   247
		return (DDI_FAILURE);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   248
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   249
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   250
	ddi_set_driver_private(dip, (caddr_t)okmsp);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   251
	ddi_report_dev(dip);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   252
	return (DDI_SUCCESS);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   253
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   254
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   255
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   256
 * okm_detach - Module's detach routine.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   257
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   258
 * Description:	Cleans up the module's state structures and any other
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   259
 *		relevant data.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   260
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   261
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   262
okm_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   263
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   264
	okms_t *okmsp;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   265
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   266
	if (cmd != DDI_DETACH) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   267
		return (DDI_FAILURE);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   268
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   269
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   270
	if ((okmsp = ddi_get_driver_private(dip)) == NULL) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   271
		return (DDI_FAILURE);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   272
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   273
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   274
	mutex_enter(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   275
	/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   276
	 * Check if the mailbox is still in use.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   277
	 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   278
	if (okmsp->km_state & OKM_MB_INITED) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   279
		mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   280
		cmn_err(CE_WARN, "Detach failure: Mailbox in use");
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   281
		return (DDI_FAILURE);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   282
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   283
	mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   284
	okm_cleanup(okmsp);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   285
	ddi_set_driver_private(dip, NULL);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   286
	return (DDI_SUCCESS);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   287
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   288
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   289
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   290
 * okm_info - Module's info routine.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   291
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   292
/* ARGSUSED */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   293
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   294
okm_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   295
{
10248
7c0b1a92a9bf 6757244 okm_info assumes dip is valid
Zach Kissel <Zachary.Kissel@Sun.COM>
parents: 8459
diff changeset
   296
	okms_t	*okmsp = &okms_global;
1772
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   297
	minor_t	minor;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   298
	int	ret = DDI_FAILURE;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   299
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   300
	switch (infocmd) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   301
	case DDI_INFO_DEVT2DEVINFO:
10248
7c0b1a92a9bf 6757244 okm_info assumes dip is valid
Zach Kissel <Zachary.Kissel@Sun.COM>
parents: 8459
diff changeset
   302
		/*
7c0b1a92a9bf 6757244 okm_info assumes dip is valid
Zach Kissel <Zachary.Kissel@Sun.COM>
parents: 8459
diff changeset
   303
		 * We have the case here where the minor number
7c0b1a92a9bf 6757244 okm_info assumes dip is valid
Zach Kissel <Zachary.Kissel@Sun.COM>
parents: 8459
diff changeset
   304
		 * is the same as the instance number. So, just
7c0b1a92a9bf 6757244 okm_info assumes dip is valid
Zach Kissel <Zachary.Kissel@Sun.COM>
parents: 8459
diff changeset
   305
		 * make sure we have the right minor node in our
7c0b1a92a9bf 6757244 okm_info assumes dip is valid
Zach Kissel <Zachary.Kissel@Sun.COM>
parents: 8459
diff changeset
   306
		 * global state. If we don't, set the result to NULL.
7c0b1a92a9bf 6757244 okm_info assumes dip is valid
Zach Kissel <Zachary.Kissel@Sun.COM>
parents: 8459
diff changeset
   307
		 */
1772
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   308
		minor = getminor((dev_t)arg);
10248
7c0b1a92a9bf 6757244 okm_info assumes dip is valid
Zach Kissel <Zachary.Kissel@Sun.COM>
parents: 8459
diff changeset
   309
		if (okmsp->km_inst != minor) {
1772
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   310
			*result = NULL;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   311
		} else {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   312
			*result = okmsp->km_dip;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   313
			ret = DDI_SUCCESS;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   314
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   315
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   316
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   317
	case DDI_INFO_DEVT2INSTANCE:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   318
		minor = getminor((dev_t)arg);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   319
		*result = (void *)(uintptr_t)minor;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   320
		ret = DDI_SUCCESS;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   321
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   322
	default:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   323
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   324
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   325
	return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   326
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   327
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   328
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   329
 * okm_open - Device open routine.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   330
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   331
 * Description:	Initializes the mailbox and waits until the mailbox
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   332
 *		gets connected. Only one open at a time is supported.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   333
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   334
/*ARGSUSED*/
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   335
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   336
okm_open(dev_t *devp, int flag, int otyp, struct cred *cred)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   337
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   338
	okms_t *okmsp = &okms_global;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   339
	int ret = 0;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   340
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   341
	DPRINTF(DBG_DRV, ("okm_open: called\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   342
	mutex_enter(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   343
	if (okmsp->km_state & OKM_OPENED) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   344
		/* Only one open supported */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   345
		mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   346
		DPRINTF(DBG_WARN, ("okm_open: already opened\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   347
		return (EBUSY);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   348
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   349
	okmsp->km_state |= OKM_OPENED;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   350
	ret = block_until_ready(okmsp);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   351
	if (ret != 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   352
		okmsp->km_state &= ~OKM_OPENED;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   353
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   354
	mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   355
	DPRINTF(DBG_DRV, ("okm_open: ret=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   356
	return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   357
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   358
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   359
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   360
 * block_until_ready - Function to wait until the mailbox is ready to use.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   361
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   362
 * Description:	It initializes the mailbox and waits for the mailbox
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   363
 *		state to transition to connected.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   364
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   365
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   366
block_until_ready(okms_t *okmsp)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   367
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   368
	int ret = 0;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   369
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   370
	DPRINTF(DBG_DRV, ("block_until_ready: called\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   371
	ASSERT(MUTEX_HELD(&okmsp->km_lock));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   372
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   373
	if (okmsp->km_state & OKM_MB_DISC) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   374
		DPRINTF(DBG_DRV, ("block_until_ready: closing the mailbox\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   375
		okm_mbox_fini(okmsp);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   376
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   377
	if (okmsp->km_state & OKM_MB_CONN) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   378
		DPRINTF(DBG_DRV, ("block_until_ready: mailbox connected\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   379
		return (0);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   380
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   381
	/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   382
	 * Initialize mailbox.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   383
	 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   384
	if ((ret = okm_mbox_init(okmsp)) != 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   385
		DPRINTF(DBG_MBOX,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   386
		    ("block_until_ready: mailbox init failed ret=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   387
		return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   388
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   389
	DPRINTF(DBG_DRV, ("block_until_ready: ret=%d", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   390
	return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   391
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   392
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   393
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   394
 * okm_close - Device close routine.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   395
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   396
 * Description: Closes the mailbox.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   397
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   398
/*ARGSUSED*/
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   399
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   400
okm_close(dev_t dev, int flag, int otyp, struct cred *cred)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   401
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   402
	okms_t *okmsp = &okms_global;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   403
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   404
	DPRINTF(DBG_DRV, ("okm_close: called\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   405
	/* Close the lower layer first */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   406
	mutex_enter(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   407
	okm_mbox_fini(okmsp);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   408
	okmsp->km_state = 0;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   409
	mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   410
	return (0);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   411
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   412
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   413
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   414
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   415
 * okm_ioctl - Device ioctl routine.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   416
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   417
 * Description:	Processes ioctls from the daemon.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   418
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   419
/*ARGSUSED*/
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   420
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   421
okm_ioctl(dev_t dev, int cmd, intptr_t data, int flag, cred_t *cred, int *rvalp)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   422
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   423
	okms_t *okmsp = &okms_global;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   424
	sckm_ioctl_getreq_t ireq;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   425
	sckm_ioctl_status_t istatus;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   426
	int ret = 0;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   427
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   428
	switch (cmd) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   429
	case SCKM_IOCTL_GETREQ:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   430
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   431
		DPRINTF(DBG_DRV, ("okm_ioctl: GETREQ\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   432
		if (okm_copyin_ioctl_getreq(data, &ireq, flag)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   433
			return (EFAULT);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   434
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   435
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   436
		ret = okm_get_req(okmsp, &ireq, data, flag);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   437
		DPRINTF(DBG_DRV, ("okm_ioctl: GETREQ ret=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   438
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   439
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   440
	case SCKM_IOCTL_STATUS:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   441
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   442
		DPRINTF(DBG_DRV, ("okm_ioctl: STATUS\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   443
		if (ddi_copyin((caddr_t)data, &istatus,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   444
		    sizeof (sckm_ioctl_status_t), flag)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   445
			return (EFAULT);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   446
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   447
		ret = okm_process_status(okmsp, &istatus);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   448
		DPRINTF(DBG_DRV, ("okm_ioctl: STATUS ret=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   449
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   450
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   451
	default:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   452
		DPRINTF(DBG_DRV, ("okm_ioctl: UNKNOWN ioctl\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   453
		ret = EINVAL;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   454
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   455
	return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   456
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   457
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   458
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   459
 * okm_get_req - Get a request from the mailbox.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   460
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   461
 * Description:	It blocks until a message is received, then processes
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   462
 *		the message and returns it to the requestor.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   463
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   464
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   465
okm_get_req(okms_t *okmsp, sckm_ioctl_getreq_t *ireqp, intptr_t data, int flag)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   466
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   467
	okm_req_hdr_t *reqp;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   468
	caddr_t msgbuf;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   469
	uint32_t len;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   470
	int ret;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   471
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   472
	DPRINTF(DBG_DRV, ("okm_getreq: called\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   473
	mutex_enter(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   474
	if ((ret = block_until_ready(okmsp)) != 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   475
		mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   476
		DPRINTF(DBG_WARN, ("okm_getreq: failed ret=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   477
		return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   478
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   479
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   480
	if (okmsp->km_reqp != NULL) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   481
		DPRINTF(DBG_DRV, ("okm_getreq: req cached\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   482
		reqp = okmsp->km_reqp;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   483
		len = okmsp->km_reqlen;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   484
		okmsp->km_reqp = NULL;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   485
		okmsp->km_reqlen = 0;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   486
	} else {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   487
retry:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   488
		while (OKM_MBOX_READY(okmsp) &&
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   489
		    ((ret = scf_mb_canget(okmsp->km_target,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   490
		    okmsp->km_key, &len)) != 0)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   491
			if (ret != ENOMSG) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   492
				DPRINTF(DBG_WARN, ("okm_getreq: Unknown "
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   493
				    "mbox failure=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   494
				mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   495
				return (EIO);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   496
			}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   497
			DPRINTF(DBG_MBOX, ("okm_getreq: waiting for mesg\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   498
			if (cv_wait_sig(&okmsp->km_wait,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   499
			    &okmsp->km_lock) <= 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   500
				mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   501
				DPRINTF(DBG_DRV, ("okm_getreq:interrupted\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   502
				return (EINTR);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   503
			}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   504
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   505
		if (!OKM_MBOX_READY(okmsp)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   506
			mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   507
			DPRINTF(DBG_WARN, ("okm_getreq: mailbox not ready\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   508
			return (EIO);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   509
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   510
		ASSERT(len != 0);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   511
		msgbuf = kmem_alloc(len, KM_SLEEP);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   512
		okmsp->km_sg_rcv.msc_dptr = msgbuf;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   513
		okmsp->km_sg_rcv.msc_len = len;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   514
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   515
		DPRINTF(DBG_MBOX, ("okm_getreq: getmsg\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   516
		ret = scf_mb_getmsg(okmsp->km_target, okmsp->km_key, len, 1,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   517
		    &okmsp->km_sg_rcv, 0);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   518
		if (ret == ENOMSG || ret == EMSGSIZE) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   519
			kmem_free(msgbuf, len);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   520
			DPRINTF(DBG_MBOX, ("okm_getreq: nomsg ret=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   521
			goto retry;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   522
		} else if (ret != 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   523
			kmem_free(msgbuf, len);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   524
			mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   525
			DPRINTF(DBG_WARN,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   526
			    ("okm_getreq: Unknown mbox failure=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   527
			return (EIO);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   528
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   529
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   530
		/* check message length */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   531
		if (len < sizeof (okm_req_hdr_t)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   532
			/* protocol error, drop message */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   533
			kmem_free(msgbuf, len);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   534
			mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   535
			DPRINTF(DBG_WARN, ("okm_getreq: Bad message\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   536
			return (EBADMSG);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   537
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   538
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   539
		reqp = (okm_req_hdr_t *)msgbuf;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   540
		reqp->krq_version = ntohl(reqp->krq_version);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   541
		reqp->krq_transid = ntohl(reqp->krq_transid);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   542
		reqp->krq_cmd = ntohl(reqp->krq_cmd);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   543
		reqp->krq_reserved = ntohl(reqp->krq_reserved);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   544
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   545
		/* check version of the message received */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   546
		if (reqp->krq_version != OKM_PROTOCOL_VERSION) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   547
			okm_send_reply(okmsp, reqp->krq_transid,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   548
			    OKM_ERR_VERSION, 0, 0);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   549
			kmem_free(msgbuf, len);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   550
			mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   551
			DPRINTF(DBG_WARN, ("okm_getreq: Unknown version=%d\n",
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   552
			    reqp->krq_version));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   553
			return (EBADMSG);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   554
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   555
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   556
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   557
	/* process message */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   558
	ret = okm_process_req(okmsp, reqp, len, ireqp, data, flag);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   559
	if (okmsp->km_reqp == NULL) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   560
		/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   561
		 * The message is not saved, so free the buffer.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   562
		 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   563
		kmem_free(reqp, len);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   564
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   565
	mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   566
	DPRINTF(DBG_DRV, ("okm_getreq: ret=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   567
	return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   568
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   569
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   570
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   571
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   572
 * okm_process_req - Process the request.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   573
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   574
 * Description:	Validate the request and then give the request to the
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   575
 *		daemon.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   576
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   577
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   578
okm_process_req(okms_t *okmsp, okm_req_hdr_t *reqp, uint32_t len,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   579
    sckm_ioctl_getreq_t *ireqp, intptr_t data, int flag)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   580
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   581
	void *req_datap = (void *)(((char *)reqp) + sizeof (okm_req_hdr_t));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   582
	int sadb_msglen = len - sizeof (okm_req_hdr_t);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   583
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   584
	DPRINTF(DBG_DRV, ("okm_process_req: called\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   585
	DUMP_REQ(reqp, len);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   586
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   587
	switch (reqp->krq_cmd) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   588
	case OKM_MSG_SADB:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   589
		/* sanity check request */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   590
		if (sadb_msglen <= 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   591
			okm_send_reply(okmsp, reqp->krq_transid,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   592
			    OKM_ERR_SADB_MSG, 0, 0);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   593
			DPRINTF(DBG_WARN, ("okm_process_req: bad message\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   594
			return (EBADMSG);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   595
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   596
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   597
		/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   598
		 * Save the message, prior to giving it to the daemon.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   599
		 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   600
		okmsp->km_reqp = reqp;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   601
		okmsp->km_reqlen = len;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   602
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   603
		if (ireqp->buf_len < len) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   604
			DPRINTF(DBG_WARN,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   605
			    ("okm_process_req: not enough space\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   606
			return (ENOSPC);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   607
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   608
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   609
		ireqp->transid = reqp->krq_transid;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   610
		ireqp->type = SCKM_IOCTL_REQ_SADB;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   611
		if (ddi_copyout(req_datap, ireqp->buf, sadb_msglen, flag)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   612
			DPRINTF(DBG_WARN,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   613
			    ("okm_process_req: copyout failed\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   614
			return (EFAULT);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   615
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   616
		ireqp->buf_len = sadb_msglen;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   617
		if (okm_copyout_ioctl_getreq(ireqp, data, flag)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   618
			DPRINTF(DBG_WARN,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   619
			    ("okm_process_req: copyout failed\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   620
			return (EFAULT);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   621
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   622
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   623
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   624
	default:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   625
		cmn_err(CE_WARN, "Unknown cmd 0x%x received", reqp->krq_cmd);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   626
		/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   627
		 * Received an unknown command, send corresponding
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   628
		 * error message.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   629
		 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   630
		okm_send_reply(okmsp, reqp->krq_transid, OKM_ERR_BAD_CMD, 0, 0);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   631
		return (EBADMSG);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   632
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   633
	DPRINTF(DBG_DRV, ("okm_process_req: ret=0\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   634
	return (0);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   635
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   636
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   637
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   638
 * okm_process_status - Process the status from the daemon.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   639
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   640
 * Description:	Processes the status received from the daemon and sends
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   641
 *		corresponding message to the SP.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   642
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   643
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   644
okm_process_status(okms_t *okmsp, sckm_ioctl_status_t *ireply)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   645
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   646
	uint32_t status;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   647
	uint32_t sadb_msg_errno = 0;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   648
	uint32_t sadb_msg_version = 0;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   649
	okm_req_hdr_t *reqp = okmsp->km_reqp;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   650
	int ret;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   651
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   652
	DPRINTF(DBG_DRV, ("okm_process_status: called\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   653
	mutex_enter(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   654
	if ((ret = block_until_ready(okmsp)) != 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   655
		mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   656
		DPRINTF(DBG_WARN,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   657
		    ("okm_process_status: Unknown failure=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   658
		return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   659
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   660
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   661
	/* fail if no status is expected, or if it does not match */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   662
	if (!okmsp->km_reqp || (reqp->krq_transid != ireply->transid)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   663
		mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   664
		DPRINTF(DBG_WARN,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   665
		    ("okm_process_status: req/transid mismatch\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   666
		return (EINVAL);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   667
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   668
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   669
	switch (ireply->status) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   670
	case SCKM_IOCTL_STAT_SUCCESS:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   671
		DPRINTF(DBG_DRV, ("okm_process_status: SUCCESS\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   672
		status = OKM_SUCCESS;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   673
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   674
	case SCKM_IOCTL_STAT_ERR_PFKEY:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   675
		DPRINTF(DBG_DRV, ("okm_process_status: PFKEY ERROR\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   676
		status = OKM_ERR_SADB_PFKEY;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   677
		sadb_msg_errno = ireply->sadb_msg_errno;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   678
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   679
	case SCKM_IOCTL_STAT_ERR_REQ:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   680
		DPRINTF(DBG_DRV, ("okm_process_status: REQ ERROR\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   681
		status = OKM_ERR_DAEMON;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   682
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   683
	case SCKM_IOCTL_STAT_ERR_VERSION:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   684
		DPRINTF(DBG_DRV, ("okm_process_status: SADB VERSION ERROR\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   685
		status = OKM_ERR_SADB_VERSION;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   686
		sadb_msg_version = ireply->sadb_msg_version;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   687
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   688
	case SCKM_IOCTL_STAT_ERR_TIMEOUT:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   689
		DPRINTF(DBG_DRV, ("okm_process_status: TIMEOUT ERR\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   690
		status = OKM_ERR_SADB_TIMEOUT;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   691
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   692
	case SCKM_IOCTL_STAT_ERR_OTHER:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   693
		DPRINTF(DBG_DRV, ("okm_process_status: OTHER ERR\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   694
		status = OKM_ERR_DAEMON;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   695
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   696
	case SCKM_IOCTL_STAT_ERR_SADB_TYPE:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   697
		DPRINTF(DBG_DRV, ("okm_process_status: SADB TYPE ERR\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   698
		status = OKM_ERR_SADB_BAD_TYPE;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   699
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   700
	default:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   701
		cmn_err(CE_WARN, "SCKM daemon returned invalid status %d\n",
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   702
		    ireply->status);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   703
		status = OKM_ERR_DAEMON;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   704
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   705
	ret = okm_send_reply(okmsp, ireply->transid, status,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   706
	    sadb_msg_errno, sadb_msg_version);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   707
	/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   708
	 * Clean up the cached request now.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   709
	 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   710
	if (ret == 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   711
		kmem_free(okmsp->km_reqp, okmsp->km_reqlen);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   712
		okmsp->km_reqp = NULL;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   713
		okmsp->km_reqlen = 0;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   714
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   715
	mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   716
	DPRINTF(DBG_DRV, ("okm_process_status: ret=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   717
	return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   718
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   719
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   720
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   721
 * okm_copyin_ioctl_getreq - copy-in the ioctl request from the daemon.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   722
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   723
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   724
static int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   725
okm_copyin_ioctl_getreq(intptr_t userarg, sckm_ioctl_getreq_t *driverarg,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   726
    int flag)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   727
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   728
#ifdef _MULTI_DATAMODEL
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   729
	switch (ddi_model_convert_from(flag & FMODELS)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   730
	case DDI_MODEL_ILP32: {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   731
		sckm_ioctl_getreq32_t driverarg32;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   732
		if (ddi_copyin((caddr_t)userarg, &driverarg32,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   733
		    sizeof (sckm_ioctl_getreq32_t), flag)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   734
			return (EFAULT);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   735
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   736
		driverarg->transid = driverarg32.transid;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   737
		driverarg->type = driverarg32.type;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   738
		driverarg->buf = (caddr_t)(uintptr_t)driverarg32.buf;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   739
		driverarg->buf_len = driverarg32.buf_len;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   740
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   741
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   742
	case DDI_MODEL_NONE: {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   743
		if (ddi_copyin((caddr_t)userarg, &driverarg,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   744
		    sizeof (sckm_ioctl_getreq_t), flag)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   745
			return (EFAULT);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   746
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   747
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   748
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   749
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   750
#else /* ! _MULTI_DATAMODEL */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   751
	if (ddi_copyin((caddr_t)userarg, &driverarg,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   752
	    sizeof (sckm_ioctl_getreq_t), flag)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   753
		return (EFAULT);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   754
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   755
#endif /* _MULTI_DATAMODEL */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   756
	return (0);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   757
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   758
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   759
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   760
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   761
 * okm_copyout_ioctl_getreq - copy-out the request to the daemon.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   762
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   763
static int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   764
okm_copyout_ioctl_getreq(sckm_ioctl_getreq_t *driverarg, intptr_t userarg,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   765
    int flag)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   766
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   767
#ifdef _MULTI_DATAMODEL
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   768
	switch (ddi_model_convert_from(flag & FMODELS)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   769
	case DDI_MODEL_ILP32: {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   770
		sckm_ioctl_getreq32_t driverarg32;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   771
		driverarg32.transid = driverarg->transid;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   772
		driverarg32.type = driverarg->type;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   773
		driverarg32.buf = (caddr32_t)(uintptr_t)driverarg->buf;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   774
		driverarg32.buf_len = driverarg->buf_len;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   775
		if (ddi_copyout(&driverarg32, (caddr_t)userarg,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   776
		    sizeof (sckm_ioctl_getreq32_t), flag)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   777
			return (EFAULT);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   778
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   779
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   780
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   781
	case DDI_MODEL_NONE:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   782
		if (ddi_copyout(driverarg, (caddr_t)userarg,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   783
		    sizeof (sckm_ioctl_getreq_t), flag)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   784
			return (EFAULT);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   785
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   786
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   787
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   788
#else /* ! _MULTI_DATAMODEL */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   789
	if (ddi_copyout(driverarg, (caddr_t)userarg,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   790
	    sizeof (sckm_ioctl_getreq_t), flag)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   791
		return (EFAULT);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   792
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   793
#endif /* _MULTI_DATAMODEL */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   794
	return (0);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   795
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   796
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   797
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   798
 * okm_cleanup - Cleanup routine.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   799
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   800
static void
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   801
okm_cleanup(okms_t *okmsp)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   802
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   803
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   804
	ASSERT(okmsp != NULL);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   805
	if (okmsp->km_clean & OKM_CLEAN_NODE) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   806
		ddi_remove_minor_node(okmsp->km_dip, NULL);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   807
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   808
	if (okmsp->km_clean & OKM_CLEAN_LOCK)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   809
		mutex_destroy(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   810
	if (okmsp->km_clean & OKM_CLEAN_CV)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   811
		cv_destroy(&okmsp->km_wait);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   812
	if (okmsp->km_reqp != NULL) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   813
		kmem_free(okmsp->km_reqp, okmsp->km_reqlen);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   814
		okmsp->km_reqp = NULL;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   815
		okmsp->km_reqlen = 0;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   816
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   817
	ddi_set_driver_private(okmsp->km_dip, NULL);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   818
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   819
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   820
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   821
 * okm_mbox_init - Mailbox specific initialization.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   822
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   823
static int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   824
okm_mbox_init(okms_t *okmsp)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   825
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   826
	int ret;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   827
	clock_t tout;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   828
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   829
	ASSERT(MUTEX_HELD(&okmsp->km_lock));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   830
	okmsp->km_target = OKM_TARGET_ID;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   831
	okmsp->km_key = DKMD_KEY;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   832
	okmsp->km_state &= ~OKM_MB_INITED;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   833
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   834
	/* Iterate until mailbox gets connected */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   835
	while (!(okmsp->km_state & OKM_MB_CONN)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   836
		DPRINTF(DBG_MBOX, ("okm_mbox_init: calling mb_init\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   837
		ret = scf_mb_init(okmsp->km_target, okmsp->km_key,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   838
		    okm_event_handler, (void *)okmsp);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   839
		DPRINTF(DBG_MBOX, ("okm_mbox_init: mb_init ret=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   840
2126
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   841
		if (ret != 0) {
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   842
			DPRINTF(DBG_MBOX,
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   843
			    ("okm_mbox_init: failed ret =%d\n", ret));
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   844
			DTRACE_PROBE1(okm_mbox_fail, int, ret);
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   845
		} else {
1772
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   846
			okmsp->km_state |= OKM_MB_INITED;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   847
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   848
			/* Block until the mailbox is ready to communicate. */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   849
			while (!(okmsp->km_state &
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   850
			    (OKM_MB_CONN | OKM_MB_DISC))) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   851
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   852
				if (cv_wait_sig(&okmsp->km_wait,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   853
				    &okmsp->km_lock) <= 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   854
					/* interrupted */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   855
					ret = EINTR;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   856
					break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   857
				}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   858
			}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   859
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   860
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   861
		if ((ret != 0) || (okmsp->km_state & OKM_MB_DISC)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   862
2126
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   863
			if (okmsp->km_state & OKM_MB_INITED) {
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   864
				(void) scf_mb_fini(okmsp->km_target,
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   865
				    okmsp->km_key);
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   866
			}
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   867
			if (okmsp->km_state & OKM_MB_DISC) {
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   868
				DPRINTF(DBG_WARN,
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   869
				    ("okm_mbox_init: mbox DISC_ERROR\n"));
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   870
				DTRACE_PROBE1(okm_mbox_fail,
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   871
				    int, OKM_MB_DISC);
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   872
			}
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   873
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   874
			okmsp->km_state &= ~(OKM_MB_INITED | OKM_MB_DISC |
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   875
			    OKM_MB_CONN);
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   876
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   877
			if (ret == EINTR) {
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   878
				return (ret);
64740c7de22e 6432428 DSCP drivers(dm2s/oplkmdrv)don't handle DISC_ERROR properly
raghuram
parents: 1772
diff changeset
   879
			}
1772
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   880
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   881
			/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   882
			 * If there was failure, then wait for
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   883
			 * OKM_MB_TOUT secs and retry again.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   884
			 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   885
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   886
			DPRINTF(DBG_MBOX, ("okm_mbox_init: waiting...\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   887
			tout = ddi_get_lbolt() + drv_usectohz(OKM_MB_TOUT);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   888
			ret = cv_timedwait_sig(&okmsp->km_wait,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   889
			    &okmsp->km_lock, tout);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   890
			if (ret == 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   891
				/* if interrupted, return immediately. */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   892
				DPRINTF(DBG_MBOX,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   893
				    ("okm_mbox_init: interrupted\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   894
				return (EINTR);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   895
			}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   896
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   897
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   898
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   899
	ret = scf_mb_ctrl(okmsp->km_target, okmsp->km_key,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   900
	    SCF_MBOP_MAXMSGSIZE, &okmsp->km_maxsz);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   901
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   902
	/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   903
	 * The max msg size should be at least the size of reply
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   904
	 * we need to send.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   905
	 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   906
	if ((ret == 0) && (okmsp->km_maxsz < sizeof (okm_rep_hdr_t))) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   907
		cmn_err(CE_WARN, "Max message size expected >= %ld "
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   908
		    "but found %d\n", sizeof (okm_rep_hdr_t), okmsp->km_maxsz);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   909
		ret = EIO;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   910
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   911
	if (ret != 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   912
		okmsp->km_state &= ~OKM_MB_INITED;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   913
		(void) scf_mb_fini(okmsp->km_target, okmsp->km_key);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   914
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   915
	DPRINTF(DBG_MBOX, ("okm_mbox_init: mb_init ret=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   916
	return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   917
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   918
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   919
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   920
 * okm_mbox_fini - Mailbox de-initialization.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   921
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   922
static void
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   923
okm_mbox_fini(okms_t *okmsp)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   924
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   925
	int ret = 0;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   926
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   927
	ASSERT(MUTEX_HELD(&okmsp->km_lock));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   928
	if (okmsp->km_state & OKM_MB_INITED) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   929
		DPRINTF(DBG_MBOX, ("okm_mbox_fini: calling mb_fini\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   930
		ret = scf_mb_fini(okmsp->km_target, okmsp->km_key);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   931
		DPRINTF(DBG_MBOX, ("okm_mbox_fini: mb_fini ret=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   932
		if (ret != 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   933
			cmn_err(CE_WARN,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   934
			    "Failed to close the Mailbox error=%d", ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   935
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   936
		okmsp->km_state &= ~(OKM_MB_INITED | OKM_MB_CONN | OKM_MB_DISC);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   937
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   938
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   939
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   940
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   941
 * okm_event_handler - Mailbox event handler.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   942
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   943
 * Description:	Implements a state machine to handle all the mailbox
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   944
 *		events. For each event, it sets the appropriate state
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   945
 *		flag and wakes up the threads waiting for that event.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   946
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   947
void
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   948
okm_event_handler(scf_event_t event, void *arg)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   949
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   950
	okms_t *okmsp = (okms_t *)arg;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   951
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   952
	DPRINTF(DBG_MBOX, ("okm_event_handler: called\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   953
	ASSERT(okmsp != NULL);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   954
	mutex_enter(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   955
	if (!(okmsp->km_state & OKM_MB_INITED)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   956
		/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   957
		 * Ignore all events if the state flag indicates that the
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   958
		 * mailbox not initialized, this may happen during the close.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   959
		 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   960
		mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   961
		DPRINTF(DBG_MBOX,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   962
		    ("okm_event_handler: event=0x%X - mailbox not inited \n",
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   963
		    event));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   964
		return;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   965
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   966
	switch (event) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   967
	case SCF_MB_CONN_OK:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   968
		DPRINTF(DBG_MBOX, ("okm_event_handler: Event CONN_OK\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   969
		/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   970
		 * Now the mailbox is ready to use, lets wake up
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   971
		 * any one waiting for this event.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   972
		 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   973
		okmsp->km_state |= OKM_MB_CONN;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   974
		cv_broadcast(&okmsp->km_wait);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   975
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   976
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   977
	case SCF_MB_MSG_DATA:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   978
		DPRINTF(DBG_MBOX, ("okm_event_handler: Event MSG_DATA\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   979
		/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   980
		 * A message is available in the mailbox,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   981
		 * wakeup if any one is ready to read the message.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   982
		 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   983
		if (OKM_MBOX_READY(okmsp)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   984
			cv_broadcast(&okmsp->km_wait);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   985
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   986
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   987
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   988
	case SCF_MB_SPACE:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   989
		DPRINTF(DBG_MBOX, ("okm_event_handler: Event MB_SPACE\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   990
		/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   991
		 * Now the mailbox is ready to transmit, lets
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   992
		 * wakeup if any one is waiting to write.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   993
		 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   994
		if (OKM_MBOX_READY(okmsp)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   995
			cv_broadcast(&okmsp->km_wait);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   996
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   997
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   998
	case SCF_MB_DISC_ERROR:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
   999
		DPRINTF(DBG_MBOX, ("okm_event_handler: Event DISC_ERROR\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1000
		okmsp->km_state &= ~OKM_MB_CONN;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1001
		okmsp->km_state |= OKM_MB_DISC;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1002
		cv_broadcast(&okmsp->km_wait);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1003
		break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1004
	default:
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1005
		cmn_err(CE_WARN, "Unexpected event received\n");
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1006
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1007
	mutex_exit(&okmsp->km_lock);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1008
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1009
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1010
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1011
 * okm_send_reply - Send a mailbox reply message.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1012
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1013
int
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1014
okm_send_reply(okms_t *okmsp, uint32_t transid,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1015
    uint32_t status, uint32_t sadb_err, uint32_t sadb_ver)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1016
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1017
	okm_rep_hdr_t reply;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1018
	int ret = EIO;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1019
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1020
	DPRINTF(DBG_DRV, ("okm_send_reply: called\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1021
	ASSERT(MUTEX_HELD(&okmsp->km_lock));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1022
	reply.krp_version = htonl(OKM_PROTOCOL_VERSION);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1023
	reply.krp_transid = htonl(transid);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1024
	reply.krp_status = htonl(status);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1025
	reply.krp_sadb_errno = htonl(sadb_err);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1026
	reply.krp_sadb_version = htonl(sadb_ver);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1027
	okmsp->km_sg_tx.msc_dptr = (caddr_t)&reply;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1028
	okmsp->km_sg_tx.msc_len = sizeof (reply);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1029
	DUMP_REPLY(&reply);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1030
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1031
	while (OKM_MBOX_READY(okmsp)) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1032
		DPRINTF(DBG_MBOX, ("okm_send_reply: sending reply\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1033
		ret = scf_mb_putmsg(okmsp->km_target, okmsp->km_key,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1034
		    sizeof (reply), 1, &okmsp->km_sg_tx, 0);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1035
		DPRINTF(DBG_MBOX, ("okm_send_reply: putmsg ret=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1036
		if (ret == EBUSY || ret == ENOSPC) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1037
			/* mailbox is busy, poll/retry */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1038
			if (cv_timedwait_sig(&okmsp->km_wait,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1039
			    &okmsp->km_lock, okm_timeout_val(ret)) == 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1040
				/* interrupted */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1041
				ret = EINTR;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1042
				DPRINTF(DBG_DRV,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1043
				    ("okm_send_reply: interrupted\n"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1044
				break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1045
			}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1046
		} else {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1047
			break;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1048
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1049
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1050
	DPRINTF(DBG_DRV, ("okm_send_reply: ret=%d\n", ret));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1051
	return (ret);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1052
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1053
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1054
/*
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1055
 * okm_timeout_val -- Return appropriate timeout value.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1056
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1057
 * A small timeout value is returned for EBUSY as the mailbox busy
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1058
 * condition may go away sooner and we are expected to poll.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1059
 *
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1060
 * A larger timeout value is returned for ENOSPC case, as the condition
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1061
 * depends on the peer to release buffer space.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1062
 * NOTE: there will also be an event(SCF_MB_SPACE) but a timeout is
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1063
 * used for reliability purposes.
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1064
 */
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1065
static clock_t
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1066
okm_timeout_val(int error)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1067
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1068
	clock_t tval;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1069
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1070
	ASSERT(error == EBUSY || error == ENOSPC);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1071
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1072
	if (error == EBUSY) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1073
		tval = OKM_SM_TOUT;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1074
	} else {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1075
		tval = OKM_LG_TOUT;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1076
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1077
	return (drv_usectohz(tval));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1078
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1079
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1080
#ifdef DEBUG
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1081
static void
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1082
okm_print_req(okm_req_hdr_t *reqp, uint32_t len)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1083
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1084
	uint8_t *datap = (uint8_t *)(((char *)reqp) + sizeof (okm_req_hdr_t));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1085
	int msglen = len - sizeof (okm_req_hdr_t);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1086
	int i, j;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1087
#define	BYTES_PER_LINE	20
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1088
	char bytestr[BYTES_PER_LINE * 3 + 1];
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1089
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1090
	if (!(okm_debug & DBG_MESG))
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1091
		return;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1092
	printf("OKM: Request  ver=%d transid=%d cmd=%s\n",
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1093
	    reqp->krq_version, reqp->krq_transid,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1094
	    ((reqp->krq_cmd == OKM_MSG_SADB) ? "MSG_SADB" : "UNKNOWN"));
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1095
	for (i = 0; i < msglen; ) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1096
		for (j = 0; (j < BYTES_PER_LINE) && (i < msglen); j++, i++) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1097
			sprintf(&bytestr[j * 3], "%02X ", datap[i]);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1098
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1099
		if (j != 0) {
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1100
			printf("\t%s\n", bytestr);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1101
		}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1102
	}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1103
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1104
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1105
static void
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1106
okm_print_rep(okm_rep_hdr_t *repp)
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1107
{
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1108
	if (!(okm_debug & DBG_MESG))
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1109
		return;
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1110
	printf("OKM: Reply Ver=%d Transid=%d Status=%d ",
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1111
	    repp->krp_version, repp->krp_transid, repp->krp_status);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1112
	printf("Sadb_errno=%d Sadb_ver=%d\n", repp->krp_sadb_errno,
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1113
	    repp->krp_sadb_version);
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1114
}
78cca3d2cc4b PSARC 2004/750 Solaris for OPL
jl139090
parents:
diff changeset
  1115
#endif