1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * CDDL HEADER START
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * The contents of this file are subject to the terms of the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Common Development and Distribution License (the "License").
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * You may not use this file except in compliance with the License.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * or http://www.opensolaris.org/os/licensing.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * See the License for the specific language governing permissions
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * and limitations under the License.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * When distributing Covered Code, include this CDDL HEADER in each
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * If applicable, add the following below this CDDL HEADER, with the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * fields enclosed by brackets "[]" replaced with your own identifying
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * information: Portions Copyright [yyyy] [name of copyright owner]
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * CDDL HEADER END
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <stdio.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libdevinfo.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <sys/types.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <sys/stat.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <string.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <fcntl.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <unistd.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <stropts.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <stdlib.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <errno.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <strings.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libintl.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <net/if_types.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <net/if_dl.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <sys/dld.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <sys/ib/ib_types.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <sys/ibpart.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libdllink.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libdladm.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libdlib.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <libdladm_impl.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * IP over IB administration API; see PSARC/2010/085
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Function prototypes
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_status_t dladm_part_create(dladm_handle_t, datalink_id_t, ib_pkey_t,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala uint32_t, char *, datalink_id_t *, dladm_arg_list_t *);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic dladm_status_t i_dladm_part_create(dladm_handle_t,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_part_attr_t *);
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasamstatic dladm_status_t dladm_part_persist_conf(dladm_handle_t, const char *,
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam dladm_part_attr_t *);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic dladm_status_t i_dladm_part_delete(dladm_handle_t, datalink_id_t);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_status_t dladm_part_delete(dladm_handle_t, datalink_id_t, int);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int i_dladm_part_up(dladm_handle_t, datalink_id_t, void *);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_status_t dladm_part_up(dladm_handle_t, datalink_id_t, uint32_t);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Convert a error status returned by the IP over IB kernel driver to a
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * valid dladm status.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic dladm_status_t
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_ib_ioctl_err2status(int err)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala switch (err) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala case 0:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_OK);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala case IBD_INVALID_PORT_INST:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_INVALID_PORT_INSTANCE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala case IBD_PORT_IS_DOWN:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_PORT_IS_DOWN);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala case IBD_PKEY_NOT_PRESENT:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_PKEY_NOT_PRESENT);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala case IBD_PARTITION_EXISTS:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_PARTITION_EXISTS);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala case IBD_INVALID_PKEY:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_INVALID_PKEY);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala case IBD_NO_HW_RESOURCE:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_NO_IB_HW_RESOURCE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala case IBD_INVALID_PKEY_TBL_SIZE:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_INVALID_PKEY_TBL_SIZE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala default:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_FAILED);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic dladm_status_t
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalai_dladm_ib_ioctl(dladm_handle_t handle, int ioccmd, ibd_ioctl_t *iocp)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ioctl(dladm_dld_fd(handle), ioccmd, iocp) == 0)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_OK);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (iocp->ioc_status == 0)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (dladm_errno2status(errno));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (dladm_ib_ioctl_err2status(iocp->ioc_status));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Get the active configuration information for the partition given by
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * the 'linkid'.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic dladm_status_t
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalai_dladm_part_info_active(dladm_handle_t handle, datalink_id_t linkid,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_part_attr_t *attrp)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_ioctl_t ioc;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status = DLADM_STATUS_OK;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala bzero(&ioc, sizeof (ioc));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala bzero(attrp, sizeof (*attrp));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * The ioc_linkid here will contain the data link id of the IB partition
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * object.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ibdioc.ioc_linkid = linkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ibdioc.ioc_info_cmd = IBD_INFO_CMD_IBPART;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = i_dladm_ib_ioctl(handle, IBD_INFO_IBPART, (ibd_ioctl_t *)&ioc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto bail;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * On return from the ioctl ioc_linkid field contains the IB port's
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * linkid.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_physlinkid = ioc.ibdioc.ioc_linkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_partlinkid = ioc.ioc_partid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_pkey = ioc.ioc_pkey;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_portnum = ioc.ibdioc.ioc_portnum;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_hca_guid = ioc.ibdioc.ioc_hcaguid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_port_guid = ioc.ibdioc.ioc_portguid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_instance = ioc.ibdioc.ioc_port_inst;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * If the IP over IB driver reports that this partition was created
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * forcibly, then set the force create flag.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ioc.ioc_force_create)
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam attrp->dia_flags |= DLADM_PART_FORCE_CREATE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalabail:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Get the configuration information about the IB partition 'linkid' from the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * persistent configuration.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic dladm_status_t
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalai_dladm_part_info_persist(dladm_handle_t handle, datalink_id_t linkid,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_part_attr_t *attrp)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_conf_t conf;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char linkover[MAXLINKNAMELEN];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala datalink_class_t class;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala boolean_t force = B_FALSE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Get the IB partition's datalink ID */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((status = dladm_datalink_id2info(handle, linkid, NULL, &class,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala NULL, NULL, 0)) != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala bzero(attrp, sizeof (*attrp));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_partlinkid = linkid;
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if ((status = dladm_getsnap_conf(handle, linkid, &conf)) !=
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Get the name of the IB Phys link over which IB partition was
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * created.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_get_conf_field(handle, conf, FLINKOVER, linkover,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala sizeof (linkover));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_physlinkid = DATALINK_INVALID_LINKID;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Get the IB Phys link's datalink ID */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((status = dladm_name2info(handle, linkover,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala &attrp->dia_physlinkid, NULL, NULL, NULL)) !=
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Get the IB partition's P_Key */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_get_conf_field(handle, conf, FPORTPKEY,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala &attrp->dia_pkey, sizeof (uint64_t));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (class != DATALINK_CLASS_PART) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = DLADM_STATUS_BADARG;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * If the FFORCE field is set in the persistent configuration database
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * set the force create flag in the partition attributes.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_get_conf_field(handle, conf, FFORCE, &force,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala sizeof (boolean_t));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_NOTFOUND)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else if (force == B_TRUE) {
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam attrp->dia_flags |= DLADM_PART_FORCE_CREATE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = DLADM_STATUS_OK;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladone:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_destroy_conf(handle, conf);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Get the configuration information for the IB partition given by the datalink
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ID 'linkid'. Based on the 'flags' field the information is either from the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * active system (DLADM_OPT_ACTIVE) or from the persistent configuration
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * database.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_status_t
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_part_info(dladm_handle_t handle, datalink_id_t linkid,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_part_attr_t *attrp, uint32_t flags)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (flags == DLADM_OPT_ACTIVE)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (i_dladm_part_info_active(handle, linkid, attrp));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala else if (flags == DLADM_OPT_PERSIST)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (i_dladm_part_info_persist(handle, linkid, attrp));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala else
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_BADARG);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Get the configuration information for the IB Phys link given by the datalink
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ID 'linkid'.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/* ARGSUSED */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_status_t
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_ib_info(dladm_handle_t handle, datalink_id_t linkid,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_ib_attr_t *attrp, uint32_t flags)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam uint_t instance;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibport_ioctl_t ioc;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_phys_attr_t dpa;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status = DLADM_STATUS_OK;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * We need to get the device name of the IB Phys link to get the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * correct instance number of the IP over IB driver instance.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_ACTIVE)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_BADARG);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Get the instance number of the IP over IB driver instance which
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * represents this IB Phys link.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam if (dladm_parselink(dpa.dp_dev, NULL, &instance) != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_FAILED);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala bzero(&ioc, sizeof (ioc));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * The ioc_linkid here will contain IB port linkid here. We make the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * first ioctl call to get the P_Key table size for this HCA port.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ibdioc.ioc_linkid = linkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ibdioc.ioc_info_cmd = IBD_INFO_CMD_PKEYTBLSZ;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ioc_pkey_tbl_sz = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ibdioc.ioc_port_inst = instance;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = i_dladm_ib_ioctl(handle, IBD_INFO_IBPART, (ibd_ioctl_t *)&ioc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Now allocate the memory for the P_Key table based on the table size
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * return by the ioctl.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ioc_pkeys = calloc(sizeof (ib_pkey_t), ioc.ioc_pkey_tbl_sz);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ioc.ioc_pkeys == NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_errno2status(errno);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto bail;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Call the ioctl again to get the P_Key table and other IB Phys link
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * attributes.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ibdioc.ioc_linkid = linkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ibdioc.ioc_port_inst = instance;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ibdioc.ioc_info_cmd = IBD_INFO_CMD_IBPORT;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = i_dladm_ib_ioctl(handle, IBD_INFO_IBPART, (ibd_ioctl_t *)&ioc);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto bail;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_physlinkid = ioc.ibdioc.ioc_linkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_portnum = ioc.ibdioc.ioc_portnum;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_port_pkey_tbl_sz = ioc.ioc_pkey_tbl_sz;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_port_pkeys = ioc.ioc_pkeys;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_hca_guid = ioc.ibdioc.ioc_hcaguid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_port_guid = ioc.ibdioc.ioc_portguid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala attrp->dia_instance = ioc.ibdioc.ioc_port_inst;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalabail:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala free(ioc.ioc_pkeys);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Free the memory allocated for the IB HCA port's P_Key table by
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * dladm_ib_info library call.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalavoid
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_free_ib_info(dladm_ib_attr_t *attr)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (attr && attr->dia_port_pkeys)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala free(attr->dia_port_pkeys);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Call into the IP over IB driver to create a partition object.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic dladm_status_t
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalai_dladm_part_create(dladm_handle_t handle, dladm_part_attr_t *pattr)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_ioctl_t ioc;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala bzero(&ioc, sizeof (ioc));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* IB Physical datalink ID */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ibdioc.ioc_linkid = pattr->dia_physlinkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* IB Partition datalink ID */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ioc_partid = pattr->dia_partlinkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ioc_pkey = pattr->dia_pkey;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ibdioc.ioc_port_inst = pattr->dia_instance;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ioc_force_create = ((pattr->dia_flags & DLADM_OPT_FORCE)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala != 0);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam return (i_dladm_ib_ioctl(handle, IBD_CREATE_IBPART, &ioc.ibdioc));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Create an entry in the dladm persistent configuration database for the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * partition specified by pattr.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_status_t
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasamdladm_part_persist_conf(dladm_handle_t handle, const char *pname,
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam dladm_part_attr_t *pattr)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_conf_t conf;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char linkover[MAXLINKNAMELEN];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala uint64_t u64;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam status = dladm_create_conf(handle, pname, pattr->dia_partlinkid,
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam DATALINK_CLASS_PART, DL_IB, &conf);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Get the name of the IB Phys link over which this partition was
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * created.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_datalink_id2info(handle, pattr->dia_physlinkid,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala NULL, NULL, NULL, linkover, sizeof (linkover));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Store IB Phys link name (linkover) */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_set_conf_field(handle, conf, FLINKOVER, DLADM_TYPE_STR,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala linkover);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala u64 = pattr->dia_pkey;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Store the IB Partitions P_Key */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_set_conf_field(handle, conf, FPORTPKEY,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_TYPE_UINT64, &u64);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (pattr->dia_flags & DLADM_OPT_FORCE) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala boolean_t force = B_TRUE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Store the force create flag. */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_set_conf_field(handle, conf, FFORCE,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_TYPE_BOOLEAN, &force);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_write_conf(handle, conf);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_destroy_conf(handle, conf);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladone:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Create a new IB Partition datalink of name 'pname' over the IB Physical link
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * given in 'physlinkid' with the P_key 'pkey' and return the datalink ID in
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * 'partlinkid'. If the 'force' option is set in the 'flags' argument, the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * partition will be created even if the P_Key 'pkey' does not exist or if the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * HCA port represented by the IB Phys link is down. If the 'temporary' flag is
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * set, then the configuration information is not added to the persistent
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * database.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_status_t
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_part_create(dladm_handle_t handle, datalink_id_t physlinkid,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ib_pkey_t pkey, uint32_t flags, char *pname, datalink_id_t *partlinkid,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_arg_list_t *proplist)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int i;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala uint_t media;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala boolean_t part_created = B_FALSE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala boolean_t conf_set = B_FALSE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_phys_attr_t dpa;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_part_attr_t pattr;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala pattr.dia_pkey = pkey;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala pattr.dia_physlinkid = physlinkid; /* IB Phys link's datalink id */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala pattr.dia_flags = flags;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala flags &= ~DLADM_OPT_FORCE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Check whether the PKEY is valid. If not, return immediately
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Only full members are allowed as per the IPoIB specification
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (pattr.dia_pkey <= IB_PKEY_INVALID_FULL)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_INVALID_PKEY);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Get the media type of the Phys link datalink ID provided and
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * make sure that it is Infiniband media DL_IB)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((status = dladm_datalink_id2info(handle, pattr.dia_physlinkid, NULL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala NULL, &media, NULL, 0)) != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (media != DL_IB)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (dladm_errno2status(ENOTSUP));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Get the instance number of the IP over IB driver instance which the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * IB Phys link 'physlinkid' over which we will be creating our IB
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * partition.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((status = dladm_phys_info(handle, pattr.dia_physlinkid, &dpa,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_OPT_ACTIVE)) != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam if (dladm_parselink(dpa.dp_dev, NULL, (uint_t *)&pattr.dia_instance) !=
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_FAILED);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam if ((status = dladm_create_datalink_id(handle, pname,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DATALINK_CLASS_PART, DL_IB, flags, &pattr.dia_partlinkid)) !=
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Create the IB partition object.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = i_dladm_part_create(handle, &pattr);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala part_created = B_TRUE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * If the persist flag is set then write this partition information
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * to the persistent configuration.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (pattr.dia_flags & DLADM_OPT_PERSIST) {
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam status = dladm_part_persist_conf(handle, pname, &pattr);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala conf_set = B_TRUE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * If the name-value pair list of properties were provided set those
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * properties over the datalink.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (proplist != NULL) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala for (i = 0; i < proplist->al_count; i++) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_arg_info_t *aip = &proplist->al_info[i];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_set_linkprop(handle,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala pattr.dia_partlinkid, aip->ai_name, aip->ai_val,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala aip->ai_count, pattr.dia_flags);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala break;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladone:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (conf_set)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) dladm_remove_conf(handle, pattr.dia_partlinkid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (part_created)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) i_dladm_part_delete(handle,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala pattr.dia_partlinkid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) dladm_destroy_datalink_id(handle, pattr.dia_partlinkid,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala flags);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (partlinkid != NULL)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *partlinkid = pattr.dia_partlinkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Call into the IP over IB driver to delete the IB partition and free up all
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * the resources allocated for it.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic dladm_status_t
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalai_dladm_part_delete(dladm_handle_t handle, datalink_id_t partid)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibpart_ioctl_t ioc;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala bzero(&ioc, sizeof (ioc));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ioc.ioc_partid = partid;
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam return (i_dladm_ib_ioctl(handle, IBD_DELETE_IBPART, &ioc.ibdioc));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Delete an IB partition if 'flags' contains the active flag. Update the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * persistent configuration if 'flags' contains the persist flag.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_status_t
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_part_delete(dladm_handle_t handle, datalink_id_t partid, int flags)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status = DLADM_STATUS_OK;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala datalink_class_t class;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (flags == 0)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_BADARG);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Make sure that the datalinkid provided is an IB partition class
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * datalink ID.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((dladm_datalink_id2info(handle, partid, NULL, &class, NULL, NULL, 0)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala != DLADM_STATUS_OK))
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_BADARG);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (class != DATALINK_CLASS_PART)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_BADARG);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((flags & DLADM_OPT_ACTIVE) != 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = i_dladm_part_delete(handle, partid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status == DLADM_STATUS_OK) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) dladm_set_linkprop(handle, partid, NULL, NULL, 0,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_OPT_ACTIVE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) dladm_destroy_datalink_id(handle, partid,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_OPT_ACTIVE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else if (status != DLADM_STATUS_NOTFOUND ||
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala !(flags & DLADM_OPT_PERSIST)) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((flags & DLADM_OPT_PERSIST) != 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t db_status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala db_status = dladm_remove_conf(handle, partid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * A partition could have been temporarily deleted in which
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * case the delete of the active partition above would have
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * failed. In that case, we update the status to be returned
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * to that of the status returned for deleting the persistent
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * database entry.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status == DLADM_STATUS_NOTFOUND)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = db_status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) dladm_destroy_datalink_id(handle, partid,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_OPT_PERSIST);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Call into the IP over IB driver to create the active instances of one or all
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * IB partitions present in the persistent configuration.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/* ARGSUSED */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalai_dladm_part_up(dladm_handle_t handle, datalink_id_t plinkid, void *arg)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_conf_t conf;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala datalink_id_t linkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ib_pkey_t pkey;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala uint64_t u64;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char linkover[MAXLINKNAMELEN];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_phys_attr_t dpa;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_part_attr_t pattr;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * plinkid is the IB partition datalink's ID. Get an handle to the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * persistent configuration entry for this datalink ID. If this datalink
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ID is not present in the persistent configuration return.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou if ((status = dladm_getsnap_conf(handle, plinkid, &conf)) !=
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Get the name of the IB Phys link over which this partition was
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * created.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_get_conf_field(handle, conf, FLINKOVER, linkover,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala sizeof (linkover));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((status = dladm_name2info(handle, linkover, &linkid, NULL, NULL,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala NULL)) != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Get the phys attribute of the IB Phys link to get the device name
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * associated with the phys link. We need this to get the IP over IB
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * driver instance number.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_ACTIVE)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Get the IB partition's P_key */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala status = dladm_get_conf_field(handle, conf, FPORTPKEY, &u64,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala sizeof (u64));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (status != DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto done;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala pkey = (ib_pkey_t)u64;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * We always set the force flag during dladm_part_up because we want
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * the partition creation to succeed even if the IB HCA port over which
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * the partition is being created is still down. Since dladm_part_up
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * is usually invoked during early boot sequence, it is possible under
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * some IB subnet configurations for dladm_up_part to be called before
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * the IB link negotiation is completed and port state is set to active
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * and P_Key table is updated.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala pattr.dia_flags = DLADM_OPT_FORCE | DLADM_OPT_ACTIVE |
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_OPT_PERSIST;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* IB Phys link's datalink ID. */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala pattr.dia_physlinkid = linkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* IB Partition's datalink ID. */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala pattr.dia_partlinkid = plinkid;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala pattr.dia_pkey = pkey;
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam if (dladm_parselink(dpa.dp_dev, NULL, (uint_t *)&pattr.dia_instance) !=
c87dd6b73ce417a1c364f2b85436755e8e3ade21Rajkumar Sivaprakasam DLADM_STATUS_OK)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_WALK_CONTINUE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /* Create the active IB Partition object. */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (i_dladm_part_create(handle, &pattr) == DLADM_STATUS_OK &&
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_up_datalink_id(handle, plinkid) != DLADM_STATUS_OK)
327151705b7439cb7ab35c370f682cac7ef9523aCathy Zhou (void) i_dladm_part_delete(handle, linkid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladone:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_destroy_conf(handle, conf);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_WALK_CONTINUE);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Bring up one or all IB partition(s) present in the persistent configuration
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * database. If we need to bring up one IB Partition, its datalink ID is
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * provided in 'linkid'.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/* ARGSUSED */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_status_t
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummaladladm_part_up(dladm_handle_t handle, datalink_id_t linkid, uint32_t flags)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala dladm_status_t status = DLADM_STATUS_OK;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (linkid == DATALINK_ALL_LINKID) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) dladm_walk_datalink_id(i_dladm_part_up, handle,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala &status, DATALINK_CLASS_PART, DATALINK_ANY_MEDIATYPE,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala DLADM_OPT_PERSIST);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (DLADM_STATUS_OK);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) i_dladm_part_up(handle, linkid, &status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (status);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}