c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota/*
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * CDDL HEADER START
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota *
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * The contents of this file are subject to the terms of the
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * Common Development and Distribution License (the "License").
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * You may not use this file except in compliance with the License.
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota *
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * or http://www.opensolaris.org/os/licensing.
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * See the License for the specific language governing permissions
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * and limitations under the License.
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota *
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * When distributing Covered Code, include this CDDL HEADER in each
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * If applicable, add the following below this CDDL HEADER, with the
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * fields enclosed by brackets "[]" replaced with your own identifying
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * information: Portions Copyright [yyyy] [name of copyright owner]
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota *
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * CDDL HEADER END
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota/*
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota#include <sys/types.h>
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota#include <sys/stat.h>
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota#include <sys/conf.h>
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota#include <sys/ddi.h>
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota#include <sys/sunddi.h>
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota#include <sys/modctl.h>
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota#include <sys/strsubr.h>
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota#include <sys/socketvar.h>
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota#include <sys/rds.h>
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota#include <sys/ib/ibtl/ibti.h>
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota#include <sys/ib/clients/rdsv3/rdsv3.h>
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota#include <sys/ib/clients/rdsv3/rdsv3_debug.h>
5d5562f583b2b6affe19bdce0b3c8b1840d667a4Eiji Ota#include <sys/ib/clients/rdsv3/rdsv3_af_thr.h>
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaextern int rdsv3_init(void);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaextern void rdsv3_exit(void);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaextern void rdsv3_cong_init(void);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaextern void rdsv3_cong_exit(void);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaextern void rdsv3_trans_init(void);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaextern void rdsv3_trans_exit(void);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaextern int rdsv3_sock_init(void);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaextern void rdsv3_sock_exit(void);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota/* global */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otadev_info_t *rdsv3_dev_info = NULL;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otakmem_cache_t *rdsv3_alloc_cache = NULL;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaextern kmutex_t rdsv3_rdma_listen_id_lock;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaextern struct rdma_cm_id *rdsv3_rdma_listen_id;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaextern kmutex_t rdsv3_sock_lock;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaextern list_t rdsv3_sock_list;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
80166370c2a40fb8d363daf1c827e4ddc7d69cf6agiriextern void rdsv3_bind_init();
80166370c2a40fb8d363daf1c827e4ddc7d69cf6agiriextern void rdsv3_bind_exit();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaint
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otardsv3_sock_init()
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota{
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota RDSV3_DPRINTF4("rdsv3_sock_init", "Enter");
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_alloc_cache = kmem_cache_create("rdsv3_alloc_cache",
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota sizeof (struct rsock) + sizeof (struct rdsv3_sock), 0, NULL,
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota NULL, NULL, NULL, NULL, 0);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota if (rdsv3_alloc_cache == NULL) {
6e18d381c642549b8bb1774a803d3510aec6baafagiri RDSV3_DPRINTF2("rdsv3_alloc_cache",
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota "kmem_cache_create(rdsv3_alloc_cache) failed");
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (-1);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota }
80166370c2a40fb8d363daf1c827e4ddc7d69cf6agiri rdsv3_bind_init();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota mutex_init(&rdsv3_sock_lock, NULL, MUTEX_DRIVER, NULL);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota list_create(&rdsv3_sock_list, sizeof (struct rdsv3_sock),
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota offsetof(struct rdsv3_sock, rs_item));
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota RDSV3_DPRINTF4("rdsv3_sock_init", "Return");
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (0);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota}
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otavoid
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otardsv3_sock_exit()
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota{
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota RDSV3_DPRINTF2("rdsv3_sock_exit", "Enter");
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
80166370c2a40fb8d363daf1c827e4ddc7d69cf6agiri rdsv3_bind_exit();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota kmem_cache_destroy(rdsv3_alloc_cache);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota list_destroy(&rdsv3_sock_list);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota mutex_destroy(&rdsv3_sock_lock);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota RDSV3_DPRINTF2("rdsv3_sock_exit", "Return");
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota}
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otastatic int
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otardsv3_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota{
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota int ret;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota RDSV3_DPRINTF2("rdsv3_attach", "Enter (dip: %p)", dip);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota if (cmd != DDI_ATTACH)
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (DDI_FAILURE);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota if (rdsv3_dev_info != NULL) {
6e18d381c642549b8bb1774a803d3510aec6baafagiri RDSV3_DPRINTF2("rdsv3_attach", "Multiple RDS instances are"
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota " not supported (rdsv3_dev_info: 0x%p)", rdsv3_dev_info);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (DDI_FAILURE);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota }
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_dev_info = dip;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota mutex_init(&rdsv3_rdma_listen_id_lock, NULL, MUTEX_DRIVER, NULL);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_rdma_listen_id = NULL;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
5d5562f583b2b6affe19bdce0b3c8b1840d667a4Eiji Ota rdsv3_af_init(dip);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_trans_init();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota ret = rdsv3_init();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota if (ret) {
6e18d381c642549b8bb1774a803d3510aec6baafagiri RDSV3_DPRINTF2("rdsv3_attach", "rdsv3_init failed: %d", ret);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_trans_exit();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota mutex_destroy(&rdsv3_rdma_listen_id_lock);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_dev_info = NULL;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (DDI_FAILURE);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota }
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota ret = rdsv3_sock_init();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota if (ret) {
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_exit();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_trans_exit();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota mutex_destroy(&rdsv3_rdma_listen_id_lock);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_dev_info = NULL;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (DDI_FAILURE);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota }
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota ret = ddi_create_minor_node(dip, "rdsv3", S_IFCHR, 0, DDI_PSEUDO, 0);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota if (ret != DDI_SUCCESS) {
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota cmn_err(CE_CONT, "ddi_create_minor_node failed: %d", ret);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_sock_exit();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_exit();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_trans_exit();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota mutex_destroy(&rdsv3_rdma_listen_id_lock);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_dev_info = NULL;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (DDI_FAILURE);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota }
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota RDSV3_DPRINTF2("rdsv3_attach", "Return");
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (DDI_SUCCESS);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota}
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otastatic int
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otardsv3_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota{
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota RDSV3_DPRINTF2("rdsv3_detach", "Enter (dip: %p)", dip);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota if (cmd != DDI_DETACH)
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (DDI_FAILURE);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_sock_exit();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_exit();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_trans_exit();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota ddi_remove_minor_node(dip, "rdsv3");
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_dev_info = NULL;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota RDSV3_DPRINTF2("rdsv3_detach", "Return");
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (DDI_SUCCESS);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota}
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota/* ARGSUSED */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otastatic int
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otardsv3_info(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota{
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota int ret = DDI_FAILURE;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota RDSV3_DPRINTF2("rdsv3_info", "Enter (dip: %p, cmd: %d)", dip, cmd);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota switch (cmd) {
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota case DDI_INFO_DEVT2DEVINFO:
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota if (rdsv3_dev_info != NULL) {
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota *result = (void *)rdsv3_dev_info;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota ret = DDI_SUCCESS;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota }
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota break;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota case DDI_INFO_DEVT2INSTANCE:
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota *result = NULL;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota ret = DDI_SUCCESS;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota break;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota default:
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota break;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota }
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota RDSV3_DPRINTF4("rdsv3_info", "Return");
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (ret);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota}
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota/* Driver entry points */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otastatic struct cb_ops rdsv3_cb_ops = {
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nulldev, /* open */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nulldev, /* close */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nodev, /* strategy */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nodev, /* print */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nodev, /* dump */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nodev, /* read */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nodev, /* write */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nodev, /* ioctl */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nodev, /* devmap */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nodev, /* mmap */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nodev, /* segmap */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nochpoll, /* poll */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota ddi_prop_op, /* prop_op */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota NULL, /* stream */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota D_MP, /* cb_flag */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota CB_REV, /* rev */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nodev, /* int (*cb_aread)() */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nodev, /* int (*cb_awrite)() */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota};
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota/* Device options */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otastatic struct dev_ops rdsv3_ops = {
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota DEVO_REV, /* devo_rev, */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota 0, /* refcnt */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_info, /* info */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nulldev, /* identify */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nulldev, /* probe */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_attach, /* attach */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_detach, /* detach */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota nodev, /* reset */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota &rdsv3_cb_ops, /* driver ops - devctl interfaces */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota NULL, /* bus operations */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota NULL, /* power */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota ddi_quiesce_not_needed /* quiesce */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota};
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota/*
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * Module linkage information.
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota#define RDSV3_DEVDESC "RDSv3 IB transport driver"
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otastatic struct modldrv rdsv3_modldrv = {
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota &mod_driverops, /* Driver module */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota RDSV3_DEVDESC, /* Driver name and version */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota &rdsv3_ops, /* Driver ops */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota};
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otastatic struct modlinkage rdsv3_modlinkage = {
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota MODREV_1,
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota (void *)&rdsv3_modldrv,
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota NULL
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota};
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaint
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota_init(void)
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota{
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota int ret;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota if (ibt_hw_is_present() == 0) {
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (ENODEV);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota }
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota /* Initialize logging */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_logging_initialization();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota ret = mod_install(&rdsv3_modlinkage);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota if (ret != 0) {
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota /*
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * Could not load module
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_logging_destroy();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (ret);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota }
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (0);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota}
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaint
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota_fini()
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota{
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota int ret;
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota /*
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota * Remove module
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota if ((ret = mod_remove(&rdsv3_modlinkage)) != 0) {
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (ret);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota }
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota /* Stop logging */
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota rdsv3_logging_destroy();
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (0);
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota}
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Otaint
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota_info(struct modinfo *modinfop)
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota{
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota return (mod_info(&rdsv3_modlinkage, modinfop));
c0dd49bdd68c0d758a67d56f07826f3b45cfc664Eiji Ota}