b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * See the License for the specific language governing permissions
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * and limitations under the License.
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 * CDDL HEADER END
276df1e91366009d02eabe9e2c9a6f0b9dab2bbaBill Taylor * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Use is subject to license terms.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Global Configuration Variables
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * As defined in RDS proposal
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriextern void rdsib_close_ib();
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);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* global */
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/* Driver entry points */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Device options */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri 0, /* refcnt */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Module linkage information.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Called from _init */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* RDS supports only one instance */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rdsib_statep = kmem_zalloc(sizeof (rds_state_t), KM_SLEEP);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_init(&rdsib_statep->rds_sessionlock, NULL, RW_DRIVER, NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_init(&rdsib_statep->rds_hca_lock, NULL, RW_DRIVER, NULL);
8257fab973a69800a3a3309e8af21fc1876d2df9agiri rw_init(&rds_loopback_portmap_lock, NULL, RW_DRIVER, NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_init(&rds_dpool.pool_lock, NULL, MUTEX_DRIVER, NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_init(&rds_cpool.pool_lock, NULL, MUTEX_DRIVER, NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Initialize logging */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Called from _fini */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Stop logging */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Could not load module
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Remove module
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF1("rdsib_attach", "Multiple RDS instances are"
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri " not supported (rds_dev_info: 0x%p)", rdsib_dev_info);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_taskq = ddi_taskq_create(dip, "rds_taskq", RDS_NUM_TASKQ_THREADS,
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri "ddi_taskq_create failed for rds_taskq");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ddi_create_minor_node(dip, "rdsib", S_IFCHR, 0, DDI_PSEUDO, 0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Max number of receive buffers on the system */
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.
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri rds_rx_pkts_pending_hwm = (PendingRxPktsHWM * NDataRX)/100;
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri if (ret != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* destroy taskq */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* ARGSUSED */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirdsib_info(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri switch (cmd) {
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri MaxNodes = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "UserBufferSize", RDS_USER_DATA_BUFFER_SIZE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MaxDataSendBuffers = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "MaxDataSendBuffers", RDS_MAX_DATA_SEND_BUFFERS);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MaxDataRecvBuffers = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "MaxDataRecvBuffers", RDS_MAX_DATA_RECV_BUFFERS);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MaxCtrlSendBuffers = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "MaxCtrlSendBuffers", RDS_MAX_CTRL_SEND_BUFFERS);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MaxCtrlRecvBuffers = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "MaxCtrlRecvBuffers", RDS_MAX_CTRL_RECV_BUFFERS);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DataRecvBufferLWM = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "DataRecvBufferLWM", RDS_DATA_RECV_BUFFER_LWM);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri CtrlRecvBufferLWM = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "CtrlRecvBufferLWM", RDS_CTRL_RECV_BUFFER_LWM);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri PendingRxPktsHWM = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "PendingRxPktsHWM", RDS_PENDING_RX_PKTS_HWM);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MinRnrRetry = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri IBPathRetryCount = (uint8_t)ddi_prop_get_int(DDI_DEV_T_ANY, dip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri DDI_PROP_DONTPASS, "IBPathRetryCount", RDS_IB_PATH_RETRY);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri IBPktLifeTime = (uint8_t)ddi_prop_get_int(DDI_DEV_T_ANY, dip,