b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CDDL HEADER START
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * The contents of this file are subject to the terms of the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Common Development and Distribution License (the "License").
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * You may not use this file except in compliance with the License.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * or http://www.opensolaris.org/os/licensing.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * See the License for the specific language governing permissions
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * and limitations under the License.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * When distributing Covered Code, include this CDDL HEADER in each
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * If applicable, add the following below this CDDL HEADER, with the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * fields enclosed by brackets "[]" replaced with your own identifying
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * information: Portions Copyright [yyyy] [name of copyright owner]
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CDDL HEADER END
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
276df1e91366009d02eabe9e2c9a6f0b9dab2bbaBill Taylor * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Use is subject to license terms.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/types.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/stat.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/conf.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ddi.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/sunddi.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/modctl.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <inet/ip.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_ib.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_buf.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_cm.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_protocol.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rds_transport.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rds_kstat.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Global Configuration Variables
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * As defined in RDS proposal
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
d99cb22f7f0de8584336bda08cb86c562ffbab55agiriuint_t MaxNodes = RDS_MAX_NODES;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t RdsPktSize;
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiriuint_t NDataRX;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t MaxDataSendBuffers = RDS_MAX_DATA_SEND_BUFFERS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t MaxDataRecvBuffers = RDS_MAX_DATA_RECV_BUFFERS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t MaxCtrlSendBuffers = RDS_MAX_CTRL_SEND_BUFFERS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t MaxCtrlRecvBuffers = RDS_MAX_CTRL_RECV_BUFFERS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t DataRecvBufferLWM = RDS_DATA_RECV_BUFFER_LWM;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t CtrlRecvBufferLWM = RDS_CTRL_RECV_BUFFER_LWM;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t PendingRxPktsHWM = RDS_PENDING_RX_PKTS_HWM;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t MinRnrRetry = RDS_IB_RNR_RETRY;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint8_t IBPathRetryCount = RDS_IB_PATH_RETRY;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint8_t IBPktLifeTime = RDS_IB_PKT_LT;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriextern int rdsib_open_ib();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriextern void rdsib_close_ib();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriextern void rds_resume_port(in_port_t port);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriextern int rds_sendmsg(uio_t *uiop, ipaddr_t sendip, ipaddr_t recvip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri in_port_t sendport, in_port_t recvport, zoneid_t zoneid);
8257fab973a69800a3a3309e8af21fc1876d2df9agiriextern boolean_t rds_if_lookup_by_name(char *devname);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_transport_ops_t rds_ib_transport_ops = {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rdsib_open_ib,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rdsib_close_ib,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_sendmsg,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_resume_port,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_if_lookup_by_name
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri};
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* global */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_state_t *rdsib_statep = NULL;
8257fab973a69800a3a3309e8af21fc1876d2df9agirikrwlock_t rds_loopback_portmap_lock;
8257fab973a69800a3a3309e8af21fc1876d2df9agiriuint8_t rds_loopback_portmap[RDS_PORT_MAP_SIZE];
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriddi_taskq_t *rds_taskq = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiridev_info_t *rdsib_dev_info = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t rds_rx_pkts_pending_hwm;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#ifdef DEBUG
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint32_t rdsdbglvl = RDS_LOG_L3;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#else
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint32_t rdsdbglvl = RDS_LOG_L2;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#endif
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#define RDS_NUM_TASKQ_THREADS 4
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic int rdsib_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic int rdsib_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic int rdsib_info(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void **result);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic void rds_read_config_values(dev_info_t *dip);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Driver entry points */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic struct cb_ops rdsib_cb_ops = {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nulldev, /* open */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nulldev, /* close */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nodev, /* strategy */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nodev, /* print */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nodev, /* dump */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nodev, /* read */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nodev, /* write */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nodev, /* ioctl */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nodev, /* devmap */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nodev, /* mmap */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nodev, /* segmap */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nochpoll, /* poll */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ddi_prop_op, /* prop_op */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri NULL, /* stream */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri D_MP, /* cb_flag */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri CB_REV, /* rev */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nodev, /* int (*cb_aread)() */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nodev, /* int (*cb_awrite)() */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri};
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Device options */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic struct dev_ops rdsib_ops = {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DEVO_REV, /* devo_rev, */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri 0, /* refcnt */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rdsib_info, /* info */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nulldev, /* identify */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nulldev, /* probe */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rdsib_attach, /* attach */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rdsib_detach, /* detach */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nodev, /* reset */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri &rdsib_cb_ops, /* driver ops - devctl interfaces */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri NULL, /* bus operations */
193974072f41a843678abf5f61979c748687e66bSherry Moore NULL, /* power */
276df1e91366009d02eabe9e2c9a6f0b9dab2bbaBill Taylor ddi_quiesce_not_needed, /* devo_quiesce */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri};
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Module linkage information.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
193974072f41a843678abf5f61979c748687e66bSherry Moore#define RDS_DEVDESC "RDS IB driver"
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic struct modldrv rdsib_modldrv = {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri &mod_driverops, /* Driver module */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DEVDESC, /* Driver name and version */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri &rdsib_ops, /* Driver ops */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri};
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic struct modlinkage rdsib_modlinkage = {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MODREV_1,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void *)&rdsib_modldrv,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri NULL
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri};
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Called from _init */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriint
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirdsib_init()
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* RDS supports only one instance */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rdsib_statep = kmem_zalloc(sizeof (rds_state_t), KM_SLEEP);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_init(&rdsib_statep->rds_sessionlock, NULL, RW_DRIVER, NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_init(&rdsib_statep->rds_hca_lock, NULL, RW_DRIVER, NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri rw_init(&rds_loopback_portmap_lock, NULL, RW_DRIVER, NULL);
8257fab973a69800a3a3309e8af21fc1876d2df9agiri bzero(rds_loopback_portmap, RDS_PORT_MAP_SIZE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_init(&rds_dpool.pool_lock, NULL, MUTEX_DRIVER, NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cv_init(&rds_dpool.pool_cv, NULL, CV_DRIVER, NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_init(&rds_cpool.pool_lock, NULL, MUTEX_DRIVER, NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cv_init(&rds_cpool.pool_cv, NULL, CV_DRIVER, NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Initialize logging */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_logging_initialization();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_SET_NPORT(1); /* this should never be 0 */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(rds_transport_ops == NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_transport_ops = &rds_ib_transport_ops;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Called from _fini */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirdsib_fini()
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Stop logging */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_logging_destroy();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cv_destroy(&rds_dpool.pool_cv);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_destroy(&rds_dpool.pool_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cv_destroy(&rds_cpool.pool_cv);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_destroy(&rds_cpool.pool_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
8257fab973a69800a3a3309e8af21fc1876d2df9agiri rw_destroy(&rds_loopback_portmap_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_destroy(&rdsib_statep->rds_hca_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_destroy(&rdsib_statep->rds_sessionlock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri kmem_free(rdsib_statep, sizeof (rds_state_t));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_transport_ops = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriint
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri_init(void)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ibt_hw_is_present() == 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (ENODEV);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = rdsib_init();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = mod_install(&rdsib_modlinkage);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Could not load module
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rdsib_fini();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriint
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri_fini()
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Remove module
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if ((ret = mod_remove(&rdsib_modlinkage)) != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rdsib_fini();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriint
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri_info(struct modinfo *modinfop)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (mod_info(&rdsib_modlinkage, modinfop));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic int
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirdsib_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_attach", "enter");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (cmd != DDI_ATTACH)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (DDI_FAILURE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (rdsib_dev_info != NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF1("rdsib_attach", "Multiple RDS instances are"
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri " not supported (rds_dev_info: 0x%p)", rdsib_dev_info);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (DDI_FAILURE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rdsib_dev_info = dip;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_read_config_values(dip);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_taskq = ddi_taskq_create(dip, "rds_taskq", RDS_NUM_TASKQ_THREADS,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri TASKQ_DEFAULTPRI, 0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (rds_taskq == NULL) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF1("rdsib_attach",
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri "ddi_taskq_create failed for rds_taskq");
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rdsib_dev_info = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (DDI_FAILURE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ddi_create_minor_node(dip, "rdsib", S_IFCHR, 0, DDI_PSEUDO, 0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != DDI_SUCCESS) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF1("rdsib_attach",
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri "ddi_create_minor_node failed: %d", ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ddi_taskq_destroy(rds_taskq);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_taskq = NULL;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rdsib_dev_info = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (DDI_FAILURE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Max number of receive buffers on the system */
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri NDataRX = (MaxNodes - 1) * MaxDataRecvBuffers * 2;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * High water mark for the receive buffers in the system. If the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * number of buffers used crosses this mark then all sockets in
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * would be stalled. The port quota for the sockets is set based
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * on this limit.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri rds_rx_pkts_pending_hwm = (PendingRxPktsHWM * NDataRX)/100;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri ret = rdsib_initialize_ib();
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri if (ret != 0) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF1("rdsib_attach",
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri "rdsib_initialize_ib failed: %d", ret);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri ddi_taskq_destroy(rds_taskq);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri rds_taskq = NULL;
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri rdsib_dev_info = NULL;
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri return (DDI_FAILURE);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri }
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_attach", "return");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (DDI_SUCCESS);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic int
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirdsib_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_detach", "enter");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (cmd != DDI_DETACH)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (DDI_FAILURE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri rdsib_deinitialize_ib();
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ddi_remove_minor_node(dip, "rdsib");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* destroy taskq */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (rds_taskq != NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ddi_taskq_destroy(rds_taskq);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_taskq = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rdsib_dev_info = NULL;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_detach", "return");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (DDI_SUCCESS);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* ARGSUSED */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic int
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirdsib_info(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret = DDI_FAILURE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri switch (cmd) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case DDI_INFO_DEVT2DEVINFO:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (rdsib_dev_info != NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *result = (void *)rdsib_dev_info;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = DDI_SUCCESS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case DDI_INFO_DEVT2INSTANCE:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *result = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = DDI_SUCCESS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri default:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic void
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_read_config_values(dev_info_t *dip)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri MaxNodes = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri "MaxNodes", RDS_MAX_NODES);
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri UserBufferSize = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "UserBufferSize", RDS_USER_DATA_BUFFER_SIZE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MaxDataSendBuffers = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "MaxDataSendBuffers", RDS_MAX_DATA_SEND_BUFFERS);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MaxDataRecvBuffers = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "MaxDataRecvBuffers", RDS_MAX_DATA_RECV_BUFFERS);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MaxCtrlSendBuffers = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "MaxCtrlSendBuffers", RDS_MAX_CTRL_SEND_BUFFERS);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MaxCtrlRecvBuffers = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "MaxCtrlRecvBuffers", RDS_MAX_CTRL_RECV_BUFFERS);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DataRecvBufferLWM = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "DataRecvBufferLWM", RDS_DATA_RECV_BUFFER_LWM);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri CtrlRecvBufferLWM = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "CtrlRecvBufferLWM", RDS_CTRL_RECV_BUFFER_LWM);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri PendingRxPktsHWM = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "PendingRxPktsHWM", RDS_PENDING_RX_PKTS_HWM);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MinRnrRetry = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "MinRnrRetry", RDS_IB_RNR_RETRY);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri IBPathRetryCount = (uint8_t)ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "IBPathRetryCount", RDS_IB_PATH_RETRY);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri IBPktLifeTime = (uint8_t)ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "IBPktLifeTime", RDS_IB_PKT_LT);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rdsdbglvl = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "rdsdbglvl", RDS_LOG_L2);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri if (MaxNodes < 2) {
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri cmn_err(CE_WARN, "MaxNodes is set to less than 2");
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri MaxNodes = 2;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}