112163SRamaswamy.Tummala@Sun.COM /* 212163SRamaswamy.Tummala@Sun.COM * CDDL HEADER START 312163SRamaswamy.Tummala@Sun.COM * 412163SRamaswamy.Tummala@Sun.COM * The contents of this file are subject to the terms of the 512163SRamaswamy.Tummala@Sun.COM * Common Development and Distribution License (the "License"). 612163SRamaswamy.Tummala@Sun.COM * You may not use this file except in compliance with the License. 712163SRamaswamy.Tummala@Sun.COM * 812163SRamaswamy.Tummala@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 912163SRamaswamy.Tummala@Sun.COM * or http://www.opensolaris.org/os/licensing. 1012163SRamaswamy.Tummala@Sun.COM * See the License for the specific language governing permissions 1112163SRamaswamy.Tummala@Sun.COM * and limitations under the License. 1212163SRamaswamy.Tummala@Sun.COM * 1312163SRamaswamy.Tummala@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 1412163SRamaswamy.Tummala@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1512163SRamaswamy.Tummala@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 1612163SRamaswamy.Tummala@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 1712163SRamaswamy.Tummala@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 1812163SRamaswamy.Tummala@Sun.COM * 1912163SRamaswamy.Tummala@Sun.COM * CDDL HEADER END 2012163SRamaswamy.Tummala@Sun.COM */ 2112163SRamaswamy.Tummala@Sun.COM /* 2212163SRamaswamy.Tummala@Sun.COM * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 2312163SRamaswamy.Tummala@Sun.COM */ 2412163SRamaswamy.Tummala@Sun.COM 2512163SRamaswamy.Tummala@Sun.COM #include <stdio.h> 2612163SRamaswamy.Tummala@Sun.COM #include <libdevinfo.h> 2712163SRamaswamy.Tummala@Sun.COM #include <sys/types.h> 2812163SRamaswamy.Tummala@Sun.COM #include <sys/stat.h> 2912163SRamaswamy.Tummala@Sun.COM #include <string.h> 3012163SRamaswamy.Tummala@Sun.COM #include <fcntl.h> 3112163SRamaswamy.Tummala@Sun.COM #include <unistd.h> 3212163SRamaswamy.Tummala@Sun.COM #include <stropts.h> 3312163SRamaswamy.Tummala@Sun.COM #include <stdlib.h> 3412163SRamaswamy.Tummala@Sun.COM #include <errno.h> 3512163SRamaswamy.Tummala@Sun.COM #include <strings.h> 3612163SRamaswamy.Tummala@Sun.COM #include <libintl.h> 3712163SRamaswamy.Tummala@Sun.COM #include <net/if_types.h> 3812163SRamaswamy.Tummala@Sun.COM #include <net/if_dl.h> 3912163SRamaswamy.Tummala@Sun.COM #include <sys/dld.h> 4012163SRamaswamy.Tummala@Sun.COM #include <sys/ib/ib_types.h> 4112163SRamaswamy.Tummala@Sun.COM #include <sys/ibpart.h> 4212163SRamaswamy.Tummala@Sun.COM #include <libdllink.h> 4312163SRamaswamy.Tummala@Sun.COM #include <libdladm.h> 4412163SRamaswamy.Tummala@Sun.COM #include <libdlib.h> 4512163SRamaswamy.Tummala@Sun.COM #include <libdladm_impl.h> 4612163SRamaswamy.Tummala@Sun.COM 4712163SRamaswamy.Tummala@Sun.COM /* 4812163SRamaswamy.Tummala@Sun.COM * IP over IB administration API; see PSARC/2010/085 4912163SRamaswamy.Tummala@Sun.COM */ 5012163SRamaswamy.Tummala@Sun.COM 5112163SRamaswamy.Tummala@Sun.COM /* 5212163SRamaswamy.Tummala@Sun.COM * Function prototypes 5312163SRamaswamy.Tummala@Sun.COM */ 5412163SRamaswamy.Tummala@Sun.COM dladm_status_t dladm_part_create(dladm_handle_t, datalink_id_t, ib_pkey_t, 5512163SRamaswamy.Tummala@Sun.COM uint32_t, char *, datalink_id_t *, dladm_arg_list_t *); 5612163SRamaswamy.Tummala@Sun.COM static dladm_status_t i_dladm_part_create(dladm_handle_t, 5712163SRamaswamy.Tummala@Sun.COM dladm_part_attr_t *); 5812303SRajkumar.Sivaprakasam@Sun.COM static dladm_status_t dladm_part_persist_conf(dladm_handle_t, const char *, 5912303SRajkumar.Sivaprakasam@Sun.COM dladm_part_attr_t *); 6012163SRamaswamy.Tummala@Sun.COM static dladm_status_t i_dladm_part_delete(dladm_handle_t, datalink_id_t); 6112163SRamaswamy.Tummala@Sun.COM dladm_status_t dladm_part_delete(dladm_handle_t, datalink_id_t, int); 6212163SRamaswamy.Tummala@Sun.COM static int i_dladm_part_up(dladm_handle_t, datalink_id_t, void *); 6312163SRamaswamy.Tummala@Sun.COM dladm_status_t dladm_part_up(dladm_handle_t, datalink_id_t, uint32_t); 6412163SRamaswamy.Tummala@Sun.COM 6512163SRamaswamy.Tummala@Sun.COM /* 6612163SRamaswamy.Tummala@Sun.COM * Convert a error status returned by the IP over IB kernel driver to a 6712163SRamaswamy.Tummala@Sun.COM * valid dladm status. 6812163SRamaswamy.Tummala@Sun.COM */ 6912163SRamaswamy.Tummala@Sun.COM static dladm_status_t 7012163SRamaswamy.Tummala@Sun.COM dladm_ib_ioctl_err2status(int err) 7112163SRamaswamy.Tummala@Sun.COM { 7212163SRamaswamy.Tummala@Sun.COM switch (err) { 7312163SRamaswamy.Tummala@Sun.COM case 0: 7412163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_OK); 7512163SRamaswamy.Tummala@Sun.COM case IBD_INVALID_PORT_INST: 7612163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_INVALID_PORT_INSTANCE); 7712163SRamaswamy.Tummala@Sun.COM case IBD_PORT_IS_DOWN: 7812163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_PORT_IS_DOWN); 7912163SRamaswamy.Tummala@Sun.COM case IBD_PKEY_NOT_PRESENT: 8012163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_PKEY_NOT_PRESENT); 8112163SRamaswamy.Tummala@Sun.COM case IBD_PARTITION_EXISTS: 8212163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_PARTITION_EXISTS); 8312163SRamaswamy.Tummala@Sun.COM case IBD_INVALID_PKEY: 8412163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_INVALID_PKEY); 8512163SRamaswamy.Tummala@Sun.COM case IBD_NO_HW_RESOURCE: 8612163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_NO_IB_HW_RESOURCE); 8712163SRamaswamy.Tummala@Sun.COM case IBD_INVALID_PKEY_TBL_SIZE: 8812163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_INVALID_PKEY_TBL_SIZE); 8912163SRamaswamy.Tummala@Sun.COM default: 9012163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_FAILED); 9112163SRamaswamy.Tummala@Sun.COM } 9212163SRamaswamy.Tummala@Sun.COM } 9312163SRamaswamy.Tummala@Sun.COM 9412163SRamaswamy.Tummala@Sun.COM static dladm_status_t 9512163SRamaswamy.Tummala@Sun.COM i_dladm_ib_ioctl(dladm_handle_t handle, int ioccmd, ibd_ioctl_t *iocp) 9612163SRamaswamy.Tummala@Sun.COM { 9712163SRamaswamy.Tummala@Sun.COM if (ioctl(dladm_dld_fd(handle), ioccmd, iocp) == 0) 9812163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_OK); 9912163SRamaswamy.Tummala@Sun.COM 10012163SRamaswamy.Tummala@Sun.COM if (iocp->ioc_status == 0) 10112163SRamaswamy.Tummala@Sun.COM return (dladm_errno2status(errno)); 10212163SRamaswamy.Tummala@Sun.COM 10312163SRamaswamy.Tummala@Sun.COM return (dladm_ib_ioctl_err2status(iocp->ioc_status)); 10412163SRamaswamy.Tummala@Sun.COM } 10512163SRamaswamy.Tummala@Sun.COM 10612163SRamaswamy.Tummala@Sun.COM /* 10712163SRamaswamy.Tummala@Sun.COM * Get the active configuration information for the partition given by 10812163SRamaswamy.Tummala@Sun.COM * the 'linkid'. 10912163SRamaswamy.Tummala@Sun.COM */ 11012163SRamaswamy.Tummala@Sun.COM static dladm_status_t 11112163SRamaswamy.Tummala@Sun.COM i_dladm_part_info_active(dladm_handle_t handle, datalink_id_t linkid, 11212163SRamaswamy.Tummala@Sun.COM dladm_part_attr_t *attrp) 11312163SRamaswamy.Tummala@Sun.COM { 11412163SRamaswamy.Tummala@Sun.COM ibpart_ioctl_t ioc; 11512163SRamaswamy.Tummala@Sun.COM dladm_status_t status = DLADM_STATUS_OK; 11612163SRamaswamy.Tummala@Sun.COM 11712163SRamaswamy.Tummala@Sun.COM bzero(&ioc, sizeof (ioc)); 11812163SRamaswamy.Tummala@Sun.COM bzero(attrp, sizeof (*attrp)); 11912163SRamaswamy.Tummala@Sun.COM /* 12012163SRamaswamy.Tummala@Sun.COM * The ioc_linkid here will contain the data link id of the IB partition 12112163SRamaswamy.Tummala@Sun.COM * object. 12212163SRamaswamy.Tummala@Sun.COM */ 12312163SRamaswamy.Tummala@Sun.COM ioc.ibdioc.ioc_linkid = linkid; 12412163SRamaswamy.Tummala@Sun.COM ioc.ibdioc.ioc_info_cmd = IBD_INFO_CMD_IBPART; 12512163SRamaswamy.Tummala@Sun.COM 12612163SRamaswamy.Tummala@Sun.COM status = i_dladm_ib_ioctl(handle, IBD_INFO_IBPART, (ibd_ioctl_t *)&ioc); 12712163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 12812163SRamaswamy.Tummala@Sun.COM goto bail; 12912163SRamaswamy.Tummala@Sun.COM 13012163SRamaswamy.Tummala@Sun.COM /* 13112163SRamaswamy.Tummala@Sun.COM * On return from the ioctl ioc_linkid field contains the IB port's 13212163SRamaswamy.Tummala@Sun.COM * linkid. 13312163SRamaswamy.Tummala@Sun.COM */ 13412163SRamaswamy.Tummala@Sun.COM attrp->dia_physlinkid = ioc.ibdioc.ioc_linkid; 13512163SRamaswamy.Tummala@Sun.COM attrp->dia_partlinkid = ioc.ioc_partid; 13612163SRamaswamy.Tummala@Sun.COM attrp->dia_pkey = ioc.ioc_pkey; 13712163SRamaswamy.Tummala@Sun.COM attrp->dia_portnum = ioc.ibdioc.ioc_portnum; 13812163SRamaswamy.Tummala@Sun.COM attrp->dia_hca_guid = ioc.ibdioc.ioc_hcaguid; 13912163SRamaswamy.Tummala@Sun.COM attrp->dia_port_guid = ioc.ibdioc.ioc_portguid; 14012163SRamaswamy.Tummala@Sun.COM attrp->dia_instance = ioc.ibdioc.ioc_port_inst; 14112163SRamaswamy.Tummala@Sun.COM 14212163SRamaswamy.Tummala@Sun.COM /* 14312163SRamaswamy.Tummala@Sun.COM * If the IP over IB driver reports that this partition was created 14412163SRamaswamy.Tummala@Sun.COM * forcibly, then set the force create flag. 14512163SRamaswamy.Tummala@Sun.COM */ 14612163SRamaswamy.Tummala@Sun.COM if (ioc.ioc_force_create) 14712303SRajkumar.Sivaprakasam@Sun.COM attrp->dia_flags |= DLADM_PART_FORCE_CREATE; 14812163SRamaswamy.Tummala@Sun.COM 14912163SRamaswamy.Tummala@Sun.COM bail: 15012163SRamaswamy.Tummala@Sun.COM return (status); 15112163SRamaswamy.Tummala@Sun.COM } 15212163SRamaswamy.Tummala@Sun.COM 15312163SRamaswamy.Tummala@Sun.COM /* 15412163SRamaswamy.Tummala@Sun.COM * Get the configuration information about the IB partition 'linkid' from the 15512163SRamaswamy.Tummala@Sun.COM * persistent configuration. 15612163SRamaswamy.Tummala@Sun.COM */ 15712163SRamaswamy.Tummala@Sun.COM static dladm_status_t 15812163SRamaswamy.Tummala@Sun.COM i_dladm_part_info_persist(dladm_handle_t handle, datalink_id_t linkid, 15912163SRamaswamy.Tummala@Sun.COM dladm_part_attr_t *attrp) 16012163SRamaswamy.Tummala@Sun.COM { 16112163SRamaswamy.Tummala@Sun.COM dladm_conf_t conf; 16212163SRamaswamy.Tummala@Sun.COM dladm_status_t status; 16312163SRamaswamy.Tummala@Sun.COM char linkover[MAXLINKNAMELEN]; 16412163SRamaswamy.Tummala@Sun.COM datalink_class_t class; 16512163SRamaswamy.Tummala@Sun.COM boolean_t force = B_FALSE; 16612163SRamaswamy.Tummala@Sun.COM 16712163SRamaswamy.Tummala@Sun.COM /* Get the IB partition's datalink ID */ 16812163SRamaswamy.Tummala@Sun.COM if ((status = dladm_datalink_id2info(handle, linkid, NULL, &class, 16912163SRamaswamy.Tummala@Sun.COM NULL, NULL, 0)) != DLADM_STATUS_OK) 17012163SRamaswamy.Tummala@Sun.COM goto done; 17112163SRamaswamy.Tummala@Sun.COM 17212163SRamaswamy.Tummala@Sun.COM bzero(attrp, sizeof (*attrp)); 17312163SRamaswamy.Tummala@Sun.COM attrp->dia_partlinkid = linkid; 174*12824SCathy.Zhou@Sun.COM if ((status = dladm_getsnap_conf(handle, linkid, &conf)) != 17512163SRamaswamy.Tummala@Sun.COM DLADM_STATUS_OK) 17612163SRamaswamy.Tummala@Sun.COM return (status); 17712163SRamaswamy.Tummala@Sun.COM 17812163SRamaswamy.Tummala@Sun.COM /* 17912163SRamaswamy.Tummala@Sun.COM * Get the name of the IB Phys link over which IB partition was 18012163SRamaswamy.Tummala@Sun.COM * created. 18112163SRamaswamy.Tummala@Sun.COM */ 18212163SRamaswamy.Tummala@Sun.COM status = dladm_get_conf_field(handle, conf, FLINKOVER, linkover, 18312163SRamaswamy.Tummala@Sun.COM sizeof (linkover)); 18412163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) { 18512163SRamaswamy.Tummala@Sun.COM attrp->dia_physlinkid = DATALINK_INVALID_LINKID; 18612163SRamaswamy.Tummala@Sun.COM goto done; 18712163SRamaswamy.Tummala@Sun.COM } else { 18812163SRamaswamy.Tummala@Sun.COM /* Get the IB Phys link's datalink ID */ 18912163SRamaswamy.Tummala@Sun.COM if ((status = dladm_name2info(handle, linkover, 19012163SRamaswamy.Tummala@Sun.COM &attrp->dia_physlinkid, NULL, NULL, NULL)) != 19112163SRamaswamy.Tummala@Sun.COM DLADM_STATUS_OK) 19212163SRamaswamy.Tummala@Sun.COM goto done; 19312163SRamaswamy.Tummala@Sun.COM } 19412163SRamaswamy.Tummala@Sun.COM 19512163SRamaswamy.Tummala@Sun.COM /* Get the IB partition's P_Key */ 19612163SRamaswamy.Tummala@Sun.COM status = dladm_get_conf_field(handle, conf, FPORTPKEY, 19712163SRamaswamy.Tummala@Sun.COM &attrp->dia_pkey, sizeof (uint64_t)); 19812163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 19912163SRamaswamy.Tummala@Sun.COM goto done; 20012163SRamaswamy.Tummala@Sun.COM 20112163SRamaswamy.Tummala@Sun.COM if (class != DATALINK_CLASS_PART) { 20212163SRamaswamy.Tummala@Sun.COM status = DLADM_STATUS_BADARG; 20312163SRamaswamy.Tummala@Sun.COM goto done; 20412163SRamaswamy.Tummala@Sun.COM } 20512163SRamaswamy.Tummala@Sun.COM 20612163SRamaswamy.Tummala@Sun.COM /* 20712163SRamaswamy.Tummala@Sun.COM * If the FFORCE field is set in the persistent configuration database 20812163SRamaswamy.Tummala@Sun.COM * set the force create flag in the partition attributes. 20912163SRamaswamy.Tummala@Sun.COM */ 21012163SRamaswamy.Tummala@Sun.COM status = dladm_get_conf_field(handle, conf, FFORCE, &force, 21112163SRamaswamy.Tummala@Sun.COM sizeof (boolean_t)); 21212163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) { 21312163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_NOTFOUND) 21412163SRamaswamy.Tummala@Sun.COM goto done; 21512163SRamaswamy.Tummala@Sun.COM } else if (force == B_TRUE) { 21612303SRajkumar.Sivaprakasam@Sun.COM attrp->dia_flags |= DLADM_PART_FORCE_CREATE; 21712163SRamaswamy.Tummala@Sun.COM } 21812163SRamaswamy.Tummala@Sun.COM 21912163SRamaswamy.Tummala@Sun.COM status = DLADM_STATUS_OK; 22012163SRamaswamy.Tummala@Sun.COM done: 22112163SRamaswamy.Tummala@Sun.COM dladm_destroy_conf(handle, conf); 22212163SRamaswamy.Tummala@Sun.COM return (status); 22312163SRamaswamy.Tummala@Sun.COM } 22412163SRamaswamy.Tummala@Sun.COM 22512163SRamaswamy.Tummala@Sun.COM /* 22612163SRamaswamy.Tummala@Sun.COM * Get the configuration information for the IB partition given by the datalink 22712163SRamaswamy.Tummala@Sun.COM * ID 'linkid'. Based on the 'flags' field the information is either from the 22812163SRamaswamy.Tummala@Sun.COM * active system (DLADM_OPT_ACTIVE) or from the persistent configuration 22912163SRamaswamy.Tummala@Sun.COM * database. 23012163SRamaswamy.Tummala@Sun.COM */ 23112163SRamaswamy.Tummala@Sun.COM dladm_status_t 23212163SRamaswamy.Tummala@Sun.COM dladm_part_info(dladm_handle_t handle, datalink_id_t linkid, 23312163SRamaswamy.Tummala@Sun.COM dladm_part_attr_t *attrp, uint32_t flags) 23412163SRamaswamy.Tummala@Sun.COM { 23512163SRamaswamy.Tummala@Sun.COM if (flags == DLADM_OPT_ACTIVE) 23612163SRamaswamy.Tummala@Sun.COM return (i_dladm_part_info_active(handle, linkid, attrp)); 23712163SRamaswamy.Tummala@Sun.COM else if (flags == DLADM_OPT_PERSIST) 23812163SRamaswamy.Tummala@Sun.COM return (i_dladm_part_info_persist(handle, linkid, attrp)); 23912163SRamaswamy.Tummala@Sun.COM else 24012163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_BADARG); 24112163SRamaswamy.Tummala@Sun.COM } 24212163SRamaswamy.Tummala@Sun.COM 24312163SRamaswamy.Tummala@Sun.COM /* 24412163SRamaswamy.Tummala@Sun.COM * Get the configuration information for the IB Phys link given by the datalink 24512163SRamaswamy.Tummala@Sun.COM * ID 'linkid'. 24612163SRamaswamy.Tummala@Sun.COM */ 24712163SRamaswamy.Tummala@Sun.COM /* ARGSUSED */ 24812163SRamaswamy.Tummala@Sun.COM dladm_status_t 24912163SRamaswamy.Tummala@Sun.COM dladm_ib_info(dladm_handle_t handle, datalink_id_t linkid, 25012163SRamaswamy.Tummala@Sun.COM dladm_ib_attr_t *attrp, uint32_t flags) 25112163SRamaswamy.Tummala@Sun.COM { 25212303SRajkumar.Sivaprakasam@Sun.COM uint_t instance; 25312163SRamaswamy.Tummala@Sun.COM ibport_ioctl_t ioc; 25412163SRamaswamy.Tummala@Sun.COM dladm_phys_attr_t dpa; 25512163SRamaswamy.Tummala@Sun.COM dladm_status_t status = DLADM_STATUS_OK; 25612163SRamaswamy.Tummala@Sun.COM 25712163SRamaswamy.Tummala@Sun.COM /* 25812163SRamaswamy.Tummala@Sun.COM * We need to get the device name of the IB Phys link to get the 25912163SRamaswamy.Tummala@Sun.COM * correct instance number of the IP over IB driver instance. 26012163SRamaswamy.Tummala@Sun.COM */ 26112163SRamaswamy.Tummala@Sun.COM if (dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_ACTIVE) 26212163SRamaswamy.Tummala@Sun.COM != DLADM_STATUS_OK) 26312163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_BADARG); 26412163SRamaswamy.Tummala@Sun.COM 26512163SRamaswamy.Tummala@Sun.COM /* 26612163SRamaswamy.Tummala@Sun.COM * Get the instance number of the IP over IB driver instance which 26712163SRamaswamy.Tummala@Sun.COM * represents this IB Phys link. 26812163SRamaswamy.Tummala@Sun.COM */ 26912303SRajkumar.Sivaprakasam@Sun.COM if (dladm_parselink(dpa.dp_dev, NULL, &instance) != DLADM_STATUS_OK) 27012163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_FAILED); 27112163SRamaswamy.Tummala@Sun.COM 27212163SRamaswamy.Tummala@Sun.COM bzero(&ioc, sizeof (ioc)); 27312163SRamaswamy.Tummala@Sun.COM /* 27412163SRamaswamy.Tummala@Sun.COM * The ioc_linkid here will contain IB port linkid here. We make the 27512163SRamaswamy.Tummala@Sun.COM * first ioctl call to get the P_Key table size for this HCA port. 27612163SRamaswamy.Tummala@Sun.COM */ 27712163SRamaswamy.Tummala@Sun.COM ioc.ibdioc.ioc_linkid = linkid; 27812163SRamaswamy.Tummala@Sun.COM ioc.ibdioc.ioc_info_cmd = IBD_INFO_CMD_PKEYTBLSZ; 27912163SRamaswamy.Tummala@Sun.COM ioc.ioc_pkey_tbl_sz = 0; 28012163SRamaswamy.Tummala@Sun.COM ioc.ibdioc.ioc_port_inst = instance; 28112163SRamaswamy.Tummala@Sun.COM 28212163SRamaswamy.Tummala@Sun.COM status = i_dladm_ib_ioctl(handle, IBD_INFO_IBPART, (ibd_ioctl_t *)&ioc); 28312163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 28412163SRamaswamy.Tummala@Sun.COM return (status); 28512163SRamaswamy.Tummala@Sun.COM 28612163SRamaswamy.Tummala@Sun.COM /* 28712163SRamaswamy.Tummala@Sun.COM * Now allocate the memory for the P_Key table based on the table size 28812163SRamaswamy.Tummala@Sun.COM * return by the ioctl. 28912163SRamaswamy.Tummala@Sun.COM */ 29012163SRamaswamy.Tummala@Sun.COM ioc.ioc_pkeys = calloc(sizeof (ib_pkey_t), ioc.ioc_pkey_tbl_sz); 29112163SRamaswamy.Tummala@Sun.COM if (ioc.ioc_pkeys == NULL) { 29212163SRamaswamy.Tummala@Sun.COM status = dladm_errno2status(errno); 29312163SRamaswamy.Tummala@Sun.COM goto bail; 29412163SRamaswamy.Tummala@Sun.COM } 29512163SRamaswamy.Tummala@Sun.COM 29612163SRamaswamy.Tummala@Sun.COM /* 29712163SRamaswamy.Tummala@Sun.COM * Call the ioctl again to get the P_Key table and other IB Phys link 29812163SRamaswamy.Tummala@Sun.COM * attributes. 29912163SRamaswamy.Tummala@Sun.COM */ 30012163SRamaswamy.Tummala@Sun.COM ioc.ibdioc.ioc_linkid = linkid; 30112163SRamaswamy.Tummala@Sun.COM ioc.ibdioc.ioc_port_inst = instance; 30212163SRamaswamy.Tummala@Sun.COM ioc.ibdioc.ioc_info_cmd = IBD_INFO_CMD_IBPORT; 30312163SRamaswamy.Tummala@Sun.COM 30412163SRamaswamy.Tummala@Sun.COM status = i_dladm_ib_ioctl(handle, IBD_INFO_IBPART, (ibd_ioctl_t *)&ioc); 30512163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 30612163SRamaswamy.Tummala@Sun.COM goto bail; 30712163SRamaswamy.Tummala@Sun.COM 30812163SRamaswamy.Tummala@Sun.COM attrp->dia_physlinkid = ioc.ibdioc.ioc_linkid; 30912163SRamaswamy.Tummala@Sun.COM attrp->dia_portnum = ioc.ibdioc.ioc_portnum; 31012163SRamaswamy.Tummala@Sun.COM attrp->dia_port_pkey_tbl_sz = ioc.ioc_pkey_tbl_sz; 31112163SRamaswamy.Tummala@Sun.COM attrp->dia_port_pkeys = ioc.ioc_pkeys; 31212163SRamaswamy.Tummala@Sun.COM attrp->dia_hca_guid = ioc.ibdioc.ioc_hcaguid; 31312163SRamaswamy.Tummala@Sun.COM attrp->dia_port_guid = ioc.ibdioc.ioc_portguid; 31412163SRamaswamy.Tummala@Sun.COM attrp->dia_instance = ioc.ibdioc.ioc_port_inst; 31512163SRamaswamy.Tummala@Sun.COM return (status); 31612163SRamaswamy.Tummala@Sun.COM bail: 31712163SRamaswamy.Tummala@Sun.COM free(ioc.ioc_pkeys); 31812163SRamaswamy.Tummala@Sun.COM return (status); 31912163SRamaswamy.Tummala@Sun.COM } 32012163SRamaswamy.Tummala@Sun.COM 32112163SRamaswamy.Tummala@Sun.COM /* 32212163SRamaswamy.Tummala@Sun.COM * Free the memory allocated for the IB HCA port's P_Key table by 32312163SRamaswamy.Tummala@Sun.COM * dladm_ib_info library call. 32412163SRamaswamy.Tummala@Sun.COM */ 32512163SRamaswamy.Tummala@Sun.COM void 32612163SRamaswamy.Tummala@Sun.COM dladm_free_ib_info(dladm_ib_attr_t *attr) 32712163SRamaswamy.Tummala@Sun.COM { 32812163SRamaswamy.Tummala@Sun.COM if (attr && attr->dia_port_pkeys) 32912163SRamaswamy.Tummala@Sun.COM free(attr->dia_port_pkeys); 33012163SRamaswamy.Tummala@Sun.COM } 33112163SRamaswamy.Tummala@Sun.COM 33212163SRamaswamy.Tummala@Sun.COM /* 33312163SRamaswamy.Tummala@Sun.COM * Call into the IP over IB driver to create a partition object. 33412163SRamaswamy.Tummala@Sun.COM */ 33512163SRamaswamy.Tummala@Sun.COM static dladm_status_t 33612163SRamaswamy.Tummala@Sun.COM i_dladm_part_create(dladm_handle_t handle, dladm_part_attr_t *pattr) 33712163SRamaswamy.Tummala@Sun.COM { 33812163SRamaswamy.Tummala@Sun.COM ibpart_ioctl_t ioc; 33912163SRamaswamy.Tummala@Sun.COM 34012163SRamaswamy.Tummala@Sun.COM bzero(&ioc, sizeof (ioc)); 34112163SRamaswamy.Tummala@Sun.COM 34212163SRamaswamy.Tummala@Sun.COM /* IB Physical datalink ID */ 34312163SRamaswamy.Tummala@Sun.COM ioc.ibdioc.ioc_linkid = pattr->dia_physlinkid; 34412163SRamaswamy.Tummala@Sun.COM /* IB Partition datalink ID */ 34512163SRamaswamy.Tummala@Sun.COM ioc.ioc_partid = pattr->dia_partlinkid; 34612163SRamaswamy.Tummala@Sun.COM ioc.ioc_pkey = pattr->dia_pkey; 34712163SRamaswamy.Tummala@Sun.COM ioc.ibdioc.ioc_port_inst = pattr->dia_instance; 34812163SRamaswamy.Tummala@Sun.COM ioc.ioc_force_create = ((pattr->dia_flags & DLADM_OPT_FORCE) 34912163SRamaswamy.Tummala@Sun.COM != 0); 35012163SRamaswamy.Tummala@Sun.COM 35112303SRajkumar.Sivaprakasam@Sun.COM return (i_dladm_ib_ioctl(handle, IBD_CREATE_IBPART, &ioc.ibdioc)); 35212163SRamaswamy.Tummala@Sun.COM } 35312163SRamaswamy.Tummala@Sun.COM 35412163SRamaswamy.Tummala@Sun.COM /* 35512163SRamaswamy.Tummala@Sun.COM * Create an entry in the dladm persistent configuration database for the 35612163SRamaswamy.Tummala@Sun.COM * partition specified by pattr. 35712163SRamaswamy.Tummala@Sun.COM */ 35812163SRamaswamy.Tummala@Sun.COM dladm_status_t 35912303SRajkumar.Sivaprakasam@Sun.COM dladm_part_persist_conf(dladm_handle_t handle, const char *pname, 36012303SRajkumar.Sivaprakasam@Sun.COM dladm_part_attr_t *pattr) 36112163SRamaswamy.Tummala@Sun.COM { 36212163SRamaswamy.Tummala@Sun.COM 36312163SRamaswamy.Tummala@Sun.COM dladm_conf_t conf; 36412163SRamaswamy.Tummala@Sun.COM dladm_status_t status; 36512163SRamaswamy.Tummala@Sun.COM char linkover[MAXLINKNAMELEN]; 36612163SRamaswamy.Tummala@Sun.COM uint64_t u64; 36712163SRamaswamy.Tummala@Sun.COM 36812303SRajkumar.Sivaprakasam@Sun.COM status = dladm_create_conf(handle, pname, pattr->dia_partlinkid, 36912303SRajkumar.Sivaprakasam@Sun.COM DATALINK_CLASS_PART, DL_IB, &conf); 37012163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 37112163SRamaswamy.Tummala@Sun.COM return (status); 37212163SRamaswamy.Tummala@Sun.COM 37312163SRamaswamy.Tummala@Sun.COM /* 37412163SRamaswamy.Tummala@Sun.COM * Get the name of the IB Phys link over which this partition was 37512163SRamaswamy.Tummala@Sun.COM * created. 37612163SRamaswamy.Tummala@Sun.COM */ 37712163SRamaswamy.Tummala@Sun.COM status = dladm_datalink_id2info(handle, pattr->dia_physlinkid, 37812163SRamaswamy.Tummala@Sun.COM NULL, NULL, NULL, linkover, sizeof (linkover)); 37912163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 38012163SRamaswamy.Tummala@Sun.COM return (status); 38112163SRamaswamy.Tummala@Sun.COM 38212163SRamaswamy.Tummala@Sun.COM /* Store IB Phys link name (linkover) */ 38312163SRamaswamy.Tummala@Sun.COM status = dladm_set_conf_field(handle, conf, FLINKOVER, DLADM_TYPE_STR, 38412163SRamaswamy.Tummala@Sun.COM linkover); 38512163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 38612163SRamaswamy.Tummala@Sun.COM return (status); 38712163SRamaswamy.Tummala@Sun.COM 38812163SRamaswamy.Tummala@Sun.COM u64 = pattr->dia_pkey; 38912163SRamaswamy.Tummala@Sun.COM 39012163SRamaswamy.Tummala@Sun.COM /* Store the IB Partitions P_Key */ 39112163SRamaswamy.Tummala@Sun.COM status = dladm_set_conf_field(handle, conf, FPORTPKEY, 39212163SRamaswamy.Tummala@Sun.COM DLADM_TYPE_UINT64, &u64); 39312163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 39412163SRamaswamy.Tummala@Sun.COM return (status); 39512163SRamaswamy.Tummala@Sun.COM 39612163SRamaswamy.Tummala@Sun.COM if (pattr->dia_flags & DLADM_OPT_FORCE) { 39712163SRamaswamy.Tummala@Sun.COM boolean_t force = B_TRUE; 39812163SRamaswamy.Tummala@Sun.COM /* Store the force create flag. */ 39912163SRamaswamy.Tummala@Sun.COM status = dladm_set_conf_field(handle, conf, FFORCE, 40012163SRamaswamy.Tummala@Sun.COM DLADM_TYPE_BOOLEAN, &force); 40112163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 40212163SRamaswamy.Tummala@Sun.COM goto done; 40312163SRamaswamy.Tummala@Sun.COM } 40412163SRamaswamy.Tummala@Sun.COM 40512163SRamaswamy.Tummala@Sun.COM status = dladm_write_conf(handle, conf); 40612163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 40712163SRamaswamy.Tummala@Sun.COM return (status); 40812163SRamaswamy.Tummala@Sun.COM 40912163SRamaswamy.Tummala@Sun.COM dladm_destroy_conf(handle, conf); 41012163SRamaswamy.Tummala@Sun.COM done: 41112163SRamaswamy.Tummala@Sun.COM return (status); 41212163SRamaswamy.Tummala@Sun.COM } 41312163SRamaswamy.Tummala@Sun.COM 41412163SRamaswamy.Tummala@Sun.COM /* 41512163SRamaswamy.Tummala@Sun.COM * Create a new IB Partition datalink of name 'pname' over the IB Physical link 41612163SRamaswamy.Tummala@Sun.COM * given in 'physlinkid' with the P_key 'pkey' and return the datalink ID in 41712163SRamaswamy.Tummala@Sun.COM * 'partlinkid'. If the 'force' option is set in the 'flags' argument, the 41812163SRamaswamy.Tummala@Sun.COM * partition will be created even if the P_Key 'pkey' does not exist or if the 41912163SRamaswamy.Tummala@Sun.COM * HCA port represented by the IB Phys link is down. If the 'temporary' flag is 42012163SRamaswamy.Tummala@Sun.COM * set, then the configuration information is not added to the persistent 42112163SRamaswamy.Tummala@Sun.COM * database. 42212163SRamaswamy.Tummala@Sun.COM */ 42312163SRamaswamy.Tummala@Sun.COM dladm_status_t 42412163SRamaswamy.Tummala@Sun.COM dladm_part_create(dladm_handle_t handle, datalink_id_t physlinkid, 42512163SRamaswamy.Tummala@Sun.COM ib_pkey_t pkey, uint32_t flags, char *pname, datalink_id_t *partlinkid, 42612163SRamaswamy.Tummala@Sun.COM dladm_arg_list_t *proplist) 42712163SRamaswamy.Tummala@Sun.COM { 42812163SRamaswamy.Tummala@Sun.COM int i; 42912163SRamaswamy.Tummala@Sun.COM dladm_status_t status; 43012163SRamaswamy.Tummala@Sun.COM uint_t media; 43112163SRamaswamy.Tummala@Sun.COM boolean_t part_created = B_FALSE; 43212163SRamaswamy.Tummala@Sun.COM boolean_t conf_set = B_FALSE; 43312163SRamaswamy.Tummala@Sun.COM dladm_phys_attr_t dpa; 43412163SRamaswamy.Tummala@Sun.COM dladm_part_attr_t pattr; 43512163SRamaswamy.Tummala@Sun.COM 43612163SRamaswamy.Tummala@Sun.COM pattr.dia_pkey = pkey; 43712163SRamaswamy.Tummala@Sun.COM pattr.dia_physlinkid = physlinkid; /* IB Phys link's datalink id */ 43812163SRamaswamy.Tummala@Sun.COM pattr.dia_flags = flags; 43912163SRamaswamy.Tummala@Sun.COM 44012163SRamaswamy.Tummala@Sun.COM flags &= ~DLADM_OPT_FORCE; 44112163SRamaswamy.Tummala@Sun.COM 44212163SRamaswamy.Tummala@Sun.COM /* 44312163SRamaswamy.Tummala@Sun.COM * Check whether the PKEY is valid. If not, return immediately 44412163SRamaswamy.Tummala@Sun.COM * Only full members are allowed as per the IPoIB specification 44512163SRamaswamy.Tummala@Sun.COM */ 44612163SRamaswamy.Tummala@Sun.COM if (pattr.dia_pkey <= IB_PKEY_INVALID_FULL) 44712163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_INVALID_PKEY); 44812163SRamaswamy.Tummala@Sun.COM 44912163SRamaswamy.Tummala@Sun.COM /* 45012163SRamaswamy.Tummala@Sun.COM * Get the media type of the Phys link datalink ID provided and 45112163SRamaswamy.Tummala@Sun.COM * make sure that it is Infiniband media DL_IB) 45212163SRamaswamy.Tummala@Sun.COM */ 45312163SRamaswamy.Tummala@Sun.COM if ((status = dladm_datalink_id2info(handle, pattr.dia_physlinkid, NULL, 45412163SRamaswamy.Tummala@Sun.COM NULL, &media, NULL, 0)) != DLADM_STATUS_OK) 45512163SRamaswamy.Tummala@Sun.COM return (status); 45612163SRamaswamy.Tummala@Sun.COM 45712163SRamaswamy.Tummala@Sun.COM if (media != DL_IB) 45812163SRamaswamy.Tummala@Sun.COM return (dladm_errno2status(ENOTSUP)); 45912163SRamaswamy.Tummala@Sun.COM 46012163SRamaswamy.Tummala@Sun.COM /* 46112163SRamaswamy.Tummala@Sun.COM * Get the instance number of the IP over IB driver instance which the 46212163SRamaswamy.Tummala@Sun.COM * IB Phys link 'physlinkid' over which we will be creating our IB 46312163SRamaswamy.Tummala@Sun.COM * partition. 46412163SRamaswamy.Tummala@Sun.COM */ 46512163SRamaswamy.Tummala@Sun.COM if ((status = dladm_phys_info(handle, pattr.dia_physlinkid, &dpa, 46612163SRamaswamy.Tummala@Sun.COM DLADM_OPT_ACTIVE)) != DLADM_STATUS_OK) 46712163SRamaswamy.Tummala@Sun.COM return (status); 46812163SRamaswamy.Tummala@Sun.COM 46912303SRajkumar.Sivaprakasam@Sun.COM if (dladm_parselink(dpa.dp_dev, NULL, (uint_t *)&pattr.dia_instance) != 47012303SRajkumar.Sivaprakasam@Sun.COM DLADM_STATUS_OK) 47112163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_FAILED); 47212163SRamaswamy.Tummala@Sun.COM 47312163SRamaswamy.Tummala@Sun.COM 47412303SRajkumar.Sivaprakasam@Sun.COM if ((status = dladm_create_datalink_id(handle, pname, 47512163SRamaswamy.Tummala@Sun.COM DATALINK_CLASS_PART, DL_IB, flags, &pattr.dia_partlinkid)) != 47612163SRamaswamy.Tummala@Sun.COM DLADM_STATUS_OK) 47712163SRamaswamy.Tummala@Sun.COM return (status); 47812163SRamaswamy.Tummala@Sun.COM 47912163SRamaswamy.Tummala@Sun.COM /* 48012163SRamaswamy.Tummala@Sun.COM * Create the IB partition object. 48112163SRamaswamy.Tummala@Sun.COM */ 48212163SRamaswamy.Tummala@Sun.COM status = i_dladm_part_create(handle, &pattr); 48312163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 48412163SRamaswamy.Tummala@Sun.COM goto done; 48512163SRamaswamy.Tummala@Sun.COM 48612163SRamaswamy.Tummala@Sun.COM part_created = B_TRUE; 48712163SRamaswamy.Tummala@Sun.COM 48812163SRamaswamy.Tummala@Sun.COM /* 48912163SRamaswamy.Tummala@Sun.COM * If the persist flag is set then write this partition information 49012163SRamaswamy.Tummala@Sun.COM * to the persistent configuration. 49112163SRamaswamy.Tummala@Sun.COM */ 49212163SRamaswamy.Tummala@Sun.COM if (pattr.dia_flags & DLADM_OPT_PERSIST) { 49312303SRajkumar.Sivaprakasam@Sun.COM status = dladm_part_persist_conf(handle, pname, &pattr); 49412163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 49512163SRamaswamy.Tummala@Sun.COM goto done; 49612163SRamaswamy.Tummala@Sun.COM conf_set = B_TRUE; 49712163SRamaswamy.Tummala@Sun.COM } 49812163SRamaswamy.Tummala@Sun.COM 49912163SRamaswamy.Tummala@Sun.COM /* 50012163SRamaswamy.Tummala@Sun.COM * If the name-value pair list of properties were provided set those 50112163SRamaswamy.Tummala@Sun.COM * properties over the datalink. 50212163SRamaswamy.Tummala@Sun.COM */ 50312163SRamaswamy.Tummala@Sun.COM if (proplist != NULL) { 50412163SRamaswamy.Tummala@Sun.COM for (i = 0; i < proplist->al_count; i++) { 50512163SRamaswamy.Tummala@Sun.COM dladm_arg_info_t *aip = &proplist->al_info[i]; 50612163SRamaswamy.Tummala@Sun.COM 50712163SRamaswamy.Tummala@Sun.COM status = dladm_set_linkprop(handle, 50812163SRamaswamy.Tummala@Sun.COM pattr.dia_partlinkid, aip->ai_name, aip->ai_val, 50912163SRamaswamy.Tummala@Sun.COM aip->ai_count, pattr.dia_flags); 51012163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 51112163SRamaswamy.Tummala@Sun.COM break; 51212163SRamaswamy.Tummala@Sun.COM } 51312163SRamaswamy.Tummala@Sun.COM } 51412163SRamaswamy.Tummala@Sun.COM done: 51512163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) { 51612163SRamaswamy.Tummala@Sun.COM if (conf_set) 51712163SRamaswamy.Tummala@Sun.COM (void) dladm_remove_conf(handle, pattr.dia_partlinkid); 51812163SRamaswamy.Tummala@Sun.COM if (part_created) 51912163SRamaswamy.Tummala@Sun.COM (void) i_dladm_part_delete(handle, 52012163SRamaswamy.Tummala@Sun.COM pattr.dia_partlinkid); 52112163SRamaswamy.Tummala@Sun.COM (void) dladm_destroy_datalink_id(handle, pattr.dia_partlinkid, 52212163SRamaswamy.Tummala@Sun.COM flags); 52312163SRamaswamy.Tummala@Sun.COM } 52412163SRamaswamy.Tummala@Sun.COM 52512163SRamaswamy.Tummala@Sun.COM if (partlinkid != NULL) 52612163SRamaswamy.Tummala@Sun.COM *partlinkid = pattr.dia_partlinkid; 52712163SRamaswamy.Tummala@Sun.COM 52812163SRamaswamy.Tummala@Sun.COM return (status); 52912163SRamaswamy.Tummala@Sun.COM } 53012163SRamaswamy.Tummala@Sun.COM 53112163SRamaswamy.Tummala@Sun.COM /* 53212163SRamaswamy.Tummala@Sun.COM * Call into the IP over IB driver to delete the IB partition and free up all 53312163SRamaswamy.Tummala@Sun.COM * the resources allocated for it. 53412163SRamaswamy.Tummala@Sun.COM */ 53512163SRamaswamy.Tummala@Sun.COM static dladm_status_t 53612163SRamaswamy.Tummala@Sun.COM i_dladm_part_delete(dladm_handle_t handle, datalink_id_t partid) 53712163SRamaswamy.Tummala@Sun.COM { 53812163SRamaswamy.Tummala@Sun.COM ibpart_ioctl_t ioc; 53912163SRamaswamy.Tummala@Sun.COM 54012163SRamaswamy.Tummala@Sun.COM bzero(&ioc, sizeof (ioc)); 54112163SRamaswamy.Tummala@Sun.COM ioc.ioc_partid = partid; 54212303SRajkumar.Sivaprakasam@Sun.COM return (i_dladm_ib_ioctl(handle, IBD_DELETE_IBPART, &ioc.ibdioc)); 54312163SRamaswamy.Tummala@Sun.COM } 54412163SRamaswamy.Tummala@Sun.COM 54512163SRamaswamy.Tummala@Sun.COM /* 54612163SRamaswamy.Tummala@Sun.COM * Delete an IB partition if 'flags' contains the active flag. Update the 54712163SRamaswamy.Tummala@Sun.COM * persistent configuration if 'flags' contains the persist flag. 54812163SRamaswamy.Tummala@Sun.COM */ 54912163SRamaswamy.Tummala@Sun.COM dladm_status_t 55012163SRamaswamy.Tummala@Sun.COM dladm_part_delete(dladm_handle_t handle, datalink_id_t partid, int flags) 55112163SRamaswamy.Tummala@Sun.COM { 55212163SRamaswamy.Tummala@Sun.COM dladm_status_t status = DLADM_STATUS_OK; 55312163SRamaswamy.Tummala@Sun.COM datalink_class_t class; 55412163SRamaswamy.Tummala@Sun.COM 55512163SRamaswamy.Tummala@Sun.COM if (flags == 0) 55612163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_BADARG); 55712163SRamaswamy.Tummala@Sun.COM 55812163SRamaswamy.Tummala@Sun.COM /* 55912163SRamaswamy.Tummala@Sun.COM * Make sure that the datalinkid provided is an IB partition class 56012163SRamaswamy.Tummala@Sun.COM * datalink ID. 56112163SRamaswamy.Tummala@Sun.COM */ 56212163SRamaswamy.Tummala@Sun.COM if ((dladm_datalink_id2info(handle, partid, NULL, &class, NULL, NULL, 0) 56312163SRamaswamy.Tummala@Sun.COM != DLADM_STATUS_OK)) 56412163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_BADARG); 56512163SRamaswamy.Tummala@Sun.COM 56612163SRamaswamy.Tummala@Sun.COM if (class != DATALINK_CLASS_PART) 56712163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_BADARG); 56812163SRamaswamy.Tummala@Sun.COM 56912163SRamaswamy.Tummala@Sun.COM if ((flags & DLADM_OPT_ACTIVE) != 0) { 57012163SRamaswamy.Tummala@Sun.COM status = i_dladm_part_delete(handle, partid); 57112163SRamaswamy.Tummala@Sun.COM if (status == DLADM_STATUS_OK) { 57212163SRamaswamy.Tummala@Sun.COM (void) dladm_set_linkprop(handle, partid, NULL, NULL, 0, 57312163SRamaswamy.Tummala@Sun.COM DLADM_OPT_ACTIVE); 57412163SRamaswamy.Tummala@Sun.COM (void) dladm_destroy_datalink_id(handle, partid, 57512163SRamaswamy.Tummala@Sun.COM DLADM_OPT_ACTIVE); 57612163SRamaswamy.Tummala@Sun.COM } else if (status != DLADM_STATUS_NOTFOUND || 57712163SRamaswamy.Tummala@Sun.COM !(flags & DLADM_OPT_PERSIST)) { 57812163SRamaswamy.Tummala@Sun.COM return (status); 57912163SRamaswamy.Tummala@Sun.COM } 58012163SRamaswamy.Tummala@Sun.COM } 58112163SRamaswamy.Tummala@Sun.COM 58212163SRamaswamy.Tummala@Sun.COM if ((flags & DLADM_OPT_PERSIST) != 0) { 58312163SRamaswamy.Tummala@Sun.COM dladm_status_t db_status; 58412163SRamaswamy.Tummala@Sun.COM db_status = dladm_remove_conf(handle, partid); 58512163SRamaswamy.Tummala@Sun.COM 58612163SRamaswamy.Tummala@Sun.COM /* 58712163SRamaswamy.Tummala@Sun.COM * A partition could have been temporarily deleted in which 58812163SRamaswamy.Tummala@Sun.COM * case the delete of the active partition above would have 58912163SRamaswamy.Tummala@Sun.COM * failed. In that case, we update the status to be returned 59012163SRamaswamy.Tummala@Sun.COM * to that of the status returned for deleting the persistent 59112163SRamaswamy.Tummala@Sun.COM * database entry. 59212163SRamaswamy.Tummala@Sun.COM */ 59312163SRamaswamy.Tummala@Sun.COM if (status == DLADM_STATUS_NOTFOUND) 59412163SRamaswamy.Tummala@Sun.COM status = db_status; 59512163SRamaswamy.Tummala@Sun.COM 59612163SRamaswamy.Tummala@Sun.COM (void) dladm_destroy_datalink_id(handle, partid, 59712163SRamaswamy.Tummala@Sun.COM DLADM_OPT_PERSIST); 59812163SRamaswamy.Tummala@Sun.COM } 59912163SRamaswamy.Tummala@Sun.COM 60012163SRamaswamy.Tummala@Sun.COM return (status); 60112163SRamaswamy.Tummala@Sun.COM } 60212163SRamaswamy.Tummala@Sun.COM 60312163SRamaswamy.Tummala@Sun.COM /* 60412163SRamaswamy.Tummala@Sun.COM * Call into the IP over IB driver to create the active instances of one or all 60512163SRamaswamy.Tummala@Sun.COM * IB partitions present in the persistent configuration. 60612163SRamaswamy.Tummala@Sun.COM */ 60712163SRamaswamy.Tummala@Sun.COM /* ARGSUSED */ 60812163SRamaswamy.Tummala@Sun.COM static int 60912163SRamaswamy.Tummala@Sun.COM i_dladm_part_up(dladm_handle_t handle, datalink_id_t plinkid, void *arg) 61012163SRamaswamy.Tummala@Sun.COM { 61112163SRamaswamy.Tummala@Sun.COM dladm_conf_t conf; 61212163SRamaswamy.Tummala@Sun.COM datalink_id_t linkid; 61312163SRamaswamy.Tummala@Sun.COM ib_pkey_t pkey; 61412163SRamaswamy.Tummala@Sun.COM uint64_t u64; 61512163SRamaswamy.Tummala@Sun.COM char linkover[MAXLINKNAMELEN]; 61612163SRamaswamy.Tummala@Sun.COM dladm_status_t status; 61712163SRamaswamy.Tummala@Sun.COM dladm_phys_attr_t dpa; 61812163SRamaswamy.Tummala@Sun.COM dladm_part_attr_t pattr; 61912163SRamaswamy.Tummala@Sun.COM 62012163SRamaswamy.Tummala@Sun.COM /* 62112163SRamaswamy.Tummala@Sun.COM * plinkid is the IB partition datalink's ID. Get an handle to the 62212163SRamaswamy.Tummala@Sun.COM * persistent configuration entry for this datalink ID. If this datalink 62312163SRamaswamy.Tummala@Sun.COM * ID is not present in the persistent configuration return. 62412163SRamaswamy.Tummala@Sun.COM */ 625*12824SCathy.Zhou@Sun.COM if ((status = dladm_getsnap_conf(handle, plinkid, &conf)) != 62612163SRamaswamy.Tummala@Sun.COM DLADM_STATUS_OK) 62712163SRamaswamy.Tummala@Sun.COM return (status); 62812163SRamaswamy.Tummala@Sun.COM 62912163SRamaswamy.Tummala@Sun.COM /* 63012163SRamaswamy.Tummala@Sun.COM * Get the name of the IB Phys link over which this partition was 63112163SRamaswamy.Tummala@Sun.COM * created. 63212163SRamaswamy.Tummala@Sun.COM */ 63312163SRamaswamy.Tummala@Sun.COM status = dladm_get_conf_field(handle, conf, FLINKOVER, linkover, 63412163SRamaswamy.Tummala@Sun.COM sizeof (linkover)); 63512163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 63612163SRamaswamy.Tummala@Sun.COM goto done; 63712163SRamaswamy.Tummala@Sun.COM 63812163SRamaswamy.Tummala@Sun.COM if ((status = dladm_name2info(handle, linkover, &linkid, NULL, NULL, 63912163SRamaswamy.Tummala@Sun.COM NULL)) != DLADM_STATUS_OK) 64012163SRamaswamy.Tummala@Sun.COM goto done; 64112163SRamaswamy.Tummala@Sun.COM 64212163SRamaswamy.Tummala@Sun.COM /* 64312163SRamaswamy.Tummala@Sun.COM * Get the phys attribute of the IB Phys link to get the device name 64412163SRamaswamy.Tummala@Sun.COM * associated with the phys link. We need this to get the IP over IB 64512163SRamaswamy.Tummala@Sun.COM * driver instance number. 64612163SRamaswamy.Tummala@Sun.COM */ 64712163SRamaswamy.Tummala@Sun.COM if (dladm_phys_info(handle, linkid, &dpa, DLADM_OPT_ACTIVE) 64812163SRamaswamy.Tummala@Sun.COM != DLADM_STATUS_OK) 64912163SRamaswamy.Tummala@Sun.COM goto done; 65012163SRamaswamy.Tummala@Sun.COM 65112163SRamaswamy.Tummala@Sun.COM /* Get the IB partition's P_key */ 65212163SRamaswamy.Tummala@Sun.COM status = dladm_get_conf_field(handle, conf, FPORTPKEY, &u64, 65312163SRamaswamy.Tummala@Sun.COM sizeof (u64)); 65412163SRamaswamy.Tummala@Sun.COM if (status != DLADM_STATUS_OK) 65512163SRamaswamy.Tummala@Sun.COM goto done; 65612163SRamaswamy.Tummala@Sun.COM 65712163SRamaswamy.Tummala@Sun.COM pkey = (ib_pkey_t)u64; 65812163SRamaswamy.Tummala@Sun.COM 65912163SRamaswamy.Tummala@Sun.COM /* 66012163SRamaswamy.Tummala@Sun.COM * We always set the force flag during dladm_part_up because we want 66112163SRamaswamy.Tummala@Sun.COM * the partition creation to succeed even if the IB HCA port over which 66212163SRamaswamy.Tummala@Sun.COM * the partition is being created is still down. Since dladm_part_up 66312163SRamaswamy.Tummala@Sun.COM * is usually invoked during early boot sequence, it is possible under 66412163SRamaswamy.Tummala@Sun.COM * some IB subnet configurations for dladm_up_part to be called before 66512163SRamaswamy.Tummala@Sun.COM * the IB link negotiation is completed and port state is set to active 66612163SRamaswamy.Tummala@Sun.COM * and P_Key table is updated. 66712163SRamaswamy.Tummala@Sun.COM */ 66812163SRamaswamy.Tummala@Sun.COM pattr.dia_flags = DLADM_OPT_FORCE | DLADM_OPT_ACTIVE | 66912163SRamaswamy.Tummala@Sun.COM DLADM_OPT_PERSIST; 67012163SRamaswamy.Tummala@Sun.COM /* IB Phys link's datalink ID. */ 67112163SRamaswamy.Tummala@Sun.COM pattr.dia_physlinkid = linkid; 67212163SRamaswamy.Tummala@Sun.COM /* IB Partition's datalink ID. */ 67312163SRamaswamy.Tummala@Sun.COM pattr.dia_partlinkid = plinkid; 67412163SRamaswamy.Tummala@Sun.COM pattr.dia_pkey = pkey; 67512303SRajkumar.Sivaprakasam@Sun.COM if (dladm_parselink(dpa.dp_dev, NULL, (uint_t *)&pattr.dia_instance) != 67612303SRajkumar.Sivaprakasam@Sun.COM DLADM_STATUS_OK) 67712163SRamaswamy.Tummala@Sun.COM return (DLADM_WALK_CONTINUE); 67812163SRamaswamy.Tummala@Sun.COM 67912163SRamaswamy.Tummala@Sun.COM /* Create the active IB Partition object. */ 68012163SRamaswamy.Tummala@Sun.COM if (i_dladm_part_create(handle, &pattr) == DLADM_STATUS_OK && 68112163SRamaswamy.Tummala@Sun.COM dladm_up_datalink_id(handle, plinkid) != DLADM_STATUS_OK) 682*12824SCathy.Zhou@Sun.COM (void) i_dladm_part_delete(handle, linkid); 68312163SRamaswamy.Tummala@Sun.COM 68412163SRamaswamy.Tummala@Sun.COM done: 68512163SRamaswamy.Tummala@Sun.COM dladm_destroy_conf(handle, conf); 68612163SRamaswamy.Tummala@Sun.COM return (DLADM_WALK_CONTINUE); 68712163SRamaswamy.Tummala@Sun.COM } 68812163SRamaswamy.Tummala@Sun.COM 68912163SRamaswamy.Tummala@Sun.COM /* 69012163SRamaswamy.Tummala@Sun.COM * Bring up one or all IB partition(s) present in the persistent configuration 69112163SRamaswamy.Tummala@Sun.COM * database. If we need to bring up one IB Partition, its datalink ID is 69212163SRamaswamy.Tummala@Sun.COM * provided in 'linkid'. 69312163SRamaswamy.Tummala@Sun.COM */ 69412163SRamaswamy.Tummala@Sun.COM /* ARGSUSED */ 69512163SRamaswamy.Tummala@Sun.COM dladm_status_t 69612163SRamaswamy.Tummala@Sun.COM dladm_part_up(dladm_handle_t handle, datalink_id_t linkid, uint32_t flags) 69712163SRamaswamy.Tummala@Sun.COM { 69812163SRamaswamy.Tummala@Sun.COM dladm_status_t status = DLADM_STATUS_OK; 69912163SRamaswamy.Tummala@Sun.COM 70012163SRamaswamy.Tummala@Sun.COM if (linkid == DATALINK_ALL_LINKID) { 70112163SRamaswamy.Tummala@Sun.COM (void) dladm_walk_datalink_id(i_dladm_part_up, handle, 70212163SRamaswamy.Tummala@Sun.COM &status, DATALINK_CLASS_PART, DATALINK_ANY_MEDIATYPE, 70312163SRamaswamy.Tummala@Sun.COM DLADM_OPT_PERSIST); 70412163SRamaswamy.Tummala@Sun.COM return (DLADM_STATUS_OK); 70512163SRamaswamy.Tummala@Sun.COM } else { 70612163SRamaswamy.Tummala@Sun.COM (void) i_dladm_part_up(handle, linkid, &status); 70712163SRamaswamy.Tummala@Sun.COM return (status); 70812163SRamaswamy.Tummala@Sun.COM } 70912163SRamaswamy.Tummala@Sun.COM } 710