1fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick/* 2fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * IBM eServer eHCA Infiniband device driver for Linux on POWER 3fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 4fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * HCA query functions 5fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 6fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Authors: Heiko J Schick <schickhj@de.ibm.com> 7fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Christoph Raisch <raisch@de.ibm.com> 8fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 9fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Copyright (c) 2005 IBM Corporation 10fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 11fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * All rights reserved. 12fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 13fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * This source code is distributed under a dual license of GPL v2.0 and OpenIB 14fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * BSD. 15fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 16fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * OpenIB BSD License 17fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 18fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Redistribution and use in source and binary forms, with or without 19fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * modification, are permitted provided that the following conditions are met: 20fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 21fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Redistributions of source code must retain the above copyright notice, this 22fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * list of conditions and the following disclaimer. 23fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 24fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * Redistributions in binary form must reproduce the above copyright notice, 25fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * this list of conditions and the following disclaimer in the documentation 26fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * and/or other materials 27fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * provided with the distribution. 28fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * 29fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 30fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 31fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 32fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 33fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 34fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 35fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 36fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 37fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 38fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 39fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick * POSSIBILITY OF SUCH DAMAGE. 40fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick */ 41fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 425a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/gfp.h> 435a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo 44fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick#include "ehca_tools.h" 457e28db5d8ff63b1cabc221c5cb84a5f45752f1c2Hoang-Nam Nguyen#include "ehca_iverbs.h" 46fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick#include "hcp_if.h" 47fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 48c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscherstatic unsigned int limit_uint(unsigned int value) 49c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher{ 50c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher return min_t(unsigned int, value, INT_MAX); 51c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher} 52c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher 53fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props) 54fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 5591f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes int i, ret = 0; 56fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_shca *shca = container_of(ibdev, struct ehca_shca, 57fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ib_device); 58fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct hipz_query_hca *rblock; 59fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 6091f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes static const u32 cap_mapping[] = { 6191f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes IB_DEVICE_RESIZE_MAX_WR, HCA_CAP_WQE_RESIZE, 6291f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes IB_DEVICE_BAD_PKEY_CNTR, HCA_CAP_BAD_P_KEY_CTR, 6391f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes IB_DEVICE_BAD_QKEY_CNTR, HCA_CAP_Q_KEY_VIOL_CTR, 6491f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes IB_DEVICE_RAW_MULTI, HCA_CAP_RAW_PACKET_MCAST, 6591f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes IB_DEVICE_AUTO_PATH_MIG, HCA_CAP_AUTO_PATH_MIG, 6691f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes IB_DEVICE_CHANGE_PHY_PORT, HCA_CAP_SQD_RTS_PORT_CHANGE, 6791f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes IB_DEVICE_UD_AV_PORT_ENFORCE, HCA_CAP_AH_PORT_NR_CHECK, 6891f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes IB_DEVICE_CURR_QP_STATE_MOD, HCA_CAP_CUR_QP_STATE_MOD, 6991f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes IB_DEVICE_SHUTDOWN_PORT, HCA_CAP_SHUTDOWN_PORT, 7091f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes IB_DEVICE_INIT_TYPE, HCA_CAP_INIT_TYPE, 7191f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes IB_DEVICE_PORT_ACTIVE_EVENT, HCA_CAP_PORT_ACTIVE_EVENT, 7291f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes }; 7391f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes 74f2d9136133de257abbd97fec6f624d3a73d1e1fdHoang-Nam Nguyen rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 75fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!rblock) { 76fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(&shca->ib_device, "Can't allocate rblock memory."); 77fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return -ENOMEM; 78fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 79fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 80fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (hipz_h_query_hca(shca->ipz_hca_handle, rblock) != H_SUCCESS) { 81fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(&shca->ib_device, "Can't query device properties"); 82fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ret = -EINVAL; 83fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick goto query_device1; 84fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 85fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 86fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick memset(props, 0, sizeof(struct ib_device_attr)); 87abc39d3672d8af4bf6c943faf85fa8877caccf7eJoachim Fenkes props->page_size_cap = shca->hca_cap_mr_pgsize; 88fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->fw_ver = rblock->hw_ver; 89fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->max_mr_size = rblock->max_mr_size; 90fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->vendor_id = rblock->vendor_id >> 8; 91fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->vendor_part_id = rblock->vendor_part_id >> 16; 92fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->hw_ver = rblock->hw_ver; 93c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_qp = limit_uint(rblock->max_qp); 94c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_qp_wr = limit_uint(rblock->max_wqes_wq); 95c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_sge = limit_uint(rblock->max_sge); 96c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_sge_rd = limit_uint(rblock->max_sge_rd); 97c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_cq = limit_uint(rblock->max_cq); 98c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_cqe = limit_uint(rblock->max_cqe); 99c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_mr = limit_uint(rblock->max_mr); 100c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_mw = limit_uint(rblock->max_mw); 101c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_pd = limit_uint(rblock->max_pd); 102c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_ah = limit_uint(rblock->max_ah); 103c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_ee = limit_uint(rblock->max_rd_ee_context); 104c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_rdd = limit_uint(rblock->max_rd_domain); 105c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_fmr = limit_uint(rblock->max_mr); 106c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_qp_rd_atom = limit_uint(rblock->max_rr_qp); 107c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_ee_rd_atom = limit_uint(rblock->max_rr_ee_context); 108c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_res_rd_atom = limit_uint(rblock->max_rr_hca); 109c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_qp_init_rd_atom = limit_uint(rblock->max_act_wqs_qp); 110c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_ee_init_rd_atom = limit_uint(rblock->max_act_wqs_ee_context); 1115ff70cac3e98af64f9a1eaec9e762ff4927c26d1Joachim Fenkes 1125ff70cac3e98af64f9a1eaec9e762ff4927c26d1Joachim Fenkes if (EHCA_BMASK_GET(HCA_CAP_SRQ, shca->hca_cap)) { 113c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_srq = limit_uint(props->max_qp); 114c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_srq_wr = limit_uint(props->max_qp_wr); 1155ff70cac3e98af64f9a1eaec9e762ff4927c26d1Joachim Fenkes props->max_srq_sge = 3; 1165ff70cac3e98af64f9a1eaec9e762ff4927c26d1Joachim Fenkes } 1175ff70cac3e98af64f9a1eaec9e762ff4927c26d1Joachim Fenkes 118c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_pkeys = 16; 119593e4d4a05c8263a6dbd5452c21d47c5bdadd40cJoachim Fenkes /* Some FW versions say 0 here; insert sensible value in that case */ 120593e4d4a05c8263a6dbd5452c21d47c5bdadd40cJoachim Fenkes props->local_ca_ack_delay = rblock->local_ca_ack_delay ? 121593e4d4a05c8263a6dbd5452c21d47c5bdadd40cJoachim Fenkes min_t(u8, rblock->local_ca_ack_delay, 255) : 12; 122c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_raw_ipv6_qp = limit_uint(rblock->max_raw_ipv6_qp); 123c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_raw_ethy_qp = limit_uint(rblock->max_raw_ethy_qp); 124c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_mcast_grp = limit_uint(rblock->max_mcast_grp); 125c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_mcast_qp_attach = limit_uint(rblock->max_mcast_qp_attach); 126fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->max_total_mcast_qp_attach 127c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher = limit_uint(rblock->max_total_mcast_qp_attach); 128fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 12991f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes /* translate device capabilities */ 13091f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes props->device_cap_flags = IB_DEVICE_SYS_IMAGE_GUID | 13191f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes IB_DEVICE_RC_RNR_NAK_GEN | IB_DEVICE_N_NOTIFY_CQ; 13291f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes for (i = 0; i < ARRAY_SIZE(cap_mapping); i += 2) 13391f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes if (rblock->hca_cap_indicators & cap_mapping[i + 1]) 13491f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes props->device_cap_flags |= cap_mapping[i]; 13591f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes 136fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickquery_device1: 1377e28db5d8ff63b1cabc221c5cb84a5f45752f1c2Hoang-Nam Nguyen ehca_free_fw_ctrlblock(rblock); 138fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 139fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return ret; 140fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 141fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 142cf04690885972eaba830ee761de545a6956197e6Stefan Roscherstatic enum ib_mtu map_mtu(struct ehca_shca *shca, u32 fw_mtu) 143c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher{ 144c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher switch (fw_mtu) { 145c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher case 0x1: 146c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher return IB_MTU_256; 147c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher case 0x2: 148c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher return IB_MTU_512; 149c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher case 0x3: 150c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher return IB_MTU_1024; 151c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher case 0x4: 152c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher return IB_MTU_2048; 153c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher case 0x5: 154c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher return IB_MTU_4096; 155c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher default: 156c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher ehca_err(&shca->ib_device, "Unknown MTU size: %x.", 157c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher fw_mtu); 158c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher return 0; 159c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher } 160c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher} 161c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher 162cf04690885972eaba830ee761de545a6956197e6Stefan Roscherstatic u8 map_number_of_vls(struct ehca_shca *shca, u32 vl_cap) 163c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher{ 164c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher switch (vl_cap) { 165c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher case 0x1: 166c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher return 1; 167c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher case 0x2: 168c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher return 2; 169c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher case 0x3: 170c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher return 4; 171c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher case 0x4: 172c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher return 8; 173c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher case 0x5: 174c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher return 15; 175c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher default: 176c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher ehca_err(&shca->ib_device, "invalid Vl Capability: %x.", 177c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher vl_cap); 178c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher return 0; 179c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher } 180c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher} 181c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher 182fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_query_port(struct ib_device *ibdev, 183fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick u8 port, struct ib_port_attr *props) 184fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 185fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick int ret = 0; 1862b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen u64 h_ret; 187fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_shca *shca = container_of(ibdev, struct ehca_shca, 188fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ib_device); 189fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct hipz_query_port *rblock; 190fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 191f2d9136133de257abbd97fec6f624d3a73d1e1fdHoang-Nam Nguyen rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 192fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!rblock) { 193fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(&shca->ib_device, "Can't allocate rblock memory."); 194fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return -ENOMEM; 195fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 196fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 1972b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen h_ret = hipz_h_query_port(shca->ipz_hca_handle, port, rblock); 1982b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen if (h_ret != H_SUCCESS) { 199fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(&shca->ib_device, "Can't query port properties"); 200fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ret = -EINVAL; 201fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick goto query_port1; 202fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 203fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 204fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick memset(props, 0, sizeof(struct ib_port_attr)); 205fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 206c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->active_mtu = props->max_mtu = map_mtu(shca, rblock->max_mtu); 207c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes props->port_cap_flags = rblock->capability_mask; 208fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->gid_tbl_len = rblock->gid_tbl_len; 209c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher if (rblock->max_msg_sz) 210c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_msg_sz = rblock->max_msg_sz; 211c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher else 212c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_msg_sz = 0x1 << 31; 213fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->bad_pkey_cntr = rblock->bad_pkey_cntr; 214fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->qkey_viol_cntr = rblock->qkey_viol_cntr; 215fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->pkey_tbl_len = rblock->pkey_tbl_len; 216fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->lid = rblock->lid; 217fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->sm_lid = rblock->sm_lid; 218fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->lmc = rblock->lmc; 219fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->sm_sl = rblock->sm_sl; 220fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->subnet_timeout = rblock->subnet_timeout; 221fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick props->init_type_reply = rblock->init_type_reply; 222c83b5b1cb2b050c7a9054f330598df99c31abb98Stefan Roscher props->max_vl_num = map_number_of_vls(shca, rblock->vl_cap); 223fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 22440ebb5615e2e069d3b8936b894ceff436c914003Joachim Fenkes if (rblock->state && rblock->phys_width) { 22540ebb5615e2e069d3b8936b894ceff436c914003Joachim Fenkes props->phys_state = rblock->phys_pstate; 22640ebb5615e2e069d3b8936b894ceff436c914003Joachim Fenkes props->state = rblock->phys_state; 22740ebb5615e2e069d3b8936b894ceff436c914003Joachim Fenkes props->active_width = rblock->phys_width; 22840ebb5615e2e069d3b8936b894ceff436c914003Joachim Fenkes props->active_speed = rblock->phys_speed; 22940ebb5615e2e069d3b8936b894ceff436c914003Joachim Fenkes } else { 23040ebb5615e2e069d3b8936b894ceff436c914003Joachim Fenkes /* old firmware releases don't report physical 23140ebb5615e2e069d3b8936b894ceff436c914003Joachim Fenkes * port info, so use default values 23240ebb5615e2e069d3b8936b894ceff436c914003Joachim Fenkes */ 23340ebb5615e2e069d3b8936b894ceff436c914003Joachim Fenkes props->phys_state = 5; 23440ebb5615e2e069d3b8936b894ceff436c914003Joachim Fenkes props->state = rblock->state; 23540ebb5615e2e069d3b8936b894ceff436c914003Joachim Fenkes props->active_width = IB_WIDTH_12X; 2362e96691c31ecf749f48aa94ea837b95dd656f5c2Or Gerlitz props->active_speed = IB_SPEED_SDR; 23740ebb5615e2e069d3b8936b894ceff436c914003Joachim Fenkes } 2386bbcea0d42209ab5f0fae213050ad042c499ad8bHoang-Nam Nguyen 239fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickquery_port1: 2407e28db5d8ff63b1cabc221c5cb84a5f45752f1c2Hoang-Nam Nguyen ehca_free_fw_ctrlblock(rblock); 241fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 242fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return ret; 243fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 244fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 2458705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkesint ehca_query_sma_attr(struct ehca_shca *shca, 2468705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes u8 port, struct ehca_sma_attr *attr) 2478705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes{ 2488705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes int ret = 0; 2492b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen u64 h_ret; 2508705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes struct hipz_query_port *rblock; 2518705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes 2528705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes rblock = ehca_alloc_fw_ctrlblock(GFP_ATOMIC); 2538705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes if (!rblock) { 2548705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes ehca_err(&shca->ib_device, "Can't allocate rblock memory."); 2558705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes return -ENOMEM; 2568705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes } 2578705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes 2582b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen h_ret = hipz_h_query_port(shca->ipz_hca_handle, port, rblock); 2592b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen if (h_ret != H_SUCCESS) { 2608705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes ehca_err(&shca->ib_device, "Can't query port properties"); 2618705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes ret = -EINVAL; 2628705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes goto query_sma_attr1; 2638705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes } 2648705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes 2658705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes memset(attr, 0, sizeof(struct ehca_sma_attr)); 2668705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes 2678705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes attr->lid = rblock->lid; 2688705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes attr->lmc = rblock->lmc; 2698705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes attr->sm_sl = rblock->sm_sl; 2708705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes attr->sm_lid = rblock->sm_lid; 2718705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes 2728705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes attr->pkey_tbl_len = rblock->pkey_tbl_len; 2738705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes memcpy(attr->pkeys, rblock->pkey_entries, sizeof(attr->pkeys)); 2748705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes 2758705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkesquery_sma_attr1: 2768705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes ehca_free_fw_ctrlblock(rblock); 2778705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes 2788705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes return ret; 2798705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes} 2808705ce5b90118be93eb8b0ed6f49ca5ff377df24Joachim Fenkes 281fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey) 282fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 283fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick int ret = 0; 2842b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen u64 h_ret; 2852b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen struct ehca_shca *shca; 286fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct hipz_query_port *rblock; 287fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 2882b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen shca = container_of(ibdev, struct ehca_shca, ib_device); 289fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (index > 16) { 290fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(&shca->ib_device, "Invalid index: %x.", index); 291fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return -EINVAL; 292fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 293fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 294f2d9136133de257abbd97fec6f624d3a73d1e1fdHoang-Nam Nguyen rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 295fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!rblock) { 296fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(&shca->ib_device, "Can't allocate rblock memory."); 297fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return -ENOMEM; 298fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 299fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 3002b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen h_ret = hipz_h_query_port(shca->ipz_hca_handle, port, rblock); 3012b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen if (h_ret != H_SUCCESS) { 302fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(&shca->ib_device, "Can't query port properties"); 303fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ret = -EINVAL; 304fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick goto query_pkey1; 305fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 306fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 307fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick memcpy(pkey, &rblock->pkey_entries + index, sizeof(u16)); 308fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 309fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickquery_pkey1: 3107e28db5d8ff63b1cabc221c5cb84a5f45752f1c2Hoang-Nam Nguyen ehca_free_fw_ctrlblock(rblock); 311fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 312fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return ret; 313fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 314fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 315fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_query_gid(struct ib_device *ibdev, u8 port, 316fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick int index, union ib_gid *gid) 317fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 318fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick int ret = 0; 3192b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen u64 h_ret; 320fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ehca_shca *shca = container_of(ibdev, struct ehca_shca, 321fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ib_device); 322fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct hipz_query_port *rblock; 323fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 324af04662b4d80de5797a595bc9855d09ef4fe55ccRoel Kluin if (index < 0 || index > 255) { 325fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(&shca->ib_device, "Invalid index: %x.", index); 326fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return -EINVAL; 327fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 328fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 329f2d9136133de257abbd97fec6f624d3a73d1e1fdHoang-Nam Nguyen rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 330fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick if (!rblock) { 331fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(&shca->ib_device, "Can't allocate rblock memory."); 332fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return -ENOMEM; 333fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 334fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 3352b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen h_ret = hipz_h_query_port(shca->ipz_hca_handle, port, rblock); 3362b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen if (h_ret != H_SUCCESS) { 337fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ehca_err(&shca->ib_device, "Can't query port properties"); 338fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick ret = -EINVAL; 339fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick goto query_gid1; 340fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick } 341fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 342fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick memcpy(&gid->raw[0], &rblock->gid_prefix, sizeof(u64)); 343fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick memcpy(&gid->raw[8], &rblock->guid_entries[index], sizeof(u64)); 344fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 345fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickquery_gid1: 3467e28db5d8ff63b1cabc221c5cb84a5f45752f1c2Hoang-Nam Nguyen ehca_free_fw_ctrlblock(rblock); 347fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 348fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick return ret; 349fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 350fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick 351e8e91f6b4dc1179a70b0d21241b769c0ebfaa129Roland Dreierstatic const u32 allowed_port_caps = ( 352c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes IB_PORT_SM | IB_PORT_LED_INFO_SUP | IB_PORT_CM_SUP | 353c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes IB_PORT_SNMP_TUNNEL_SUP | IB_PORT_DEVICE_MGMT_SUP | 354c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes IB_PORT_VENDOR_CLASS_SUP); 355c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes 356fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schickint ehca_modify_port(struct ib_device *ibdev, 357fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick u8 port, int port_modify_mask, 358fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick struct ib_port_modify *props) 359fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick{ 360c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes int ret = 0; 3612b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen struct ehca_shca *shca; 362c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes struct hipz_query_port *rblock; 363c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes u32 cap; 364c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes u64 hret; 365c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes 3662b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen shca = container_of(ibdev, struct ehca_shca, ib_device); 367c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes if ((props->set_port_cap_mask | props->clr_port_cap_mask) 368c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes & ~allowed_port_caps) { 369c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes ehca_err(&shca->ib_device, "Non-changeable bits set in masks " 370c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes "set=%x clr=%x allowed=%x", props->set_port_cap_mask, 371c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes props->clr_port_cap_mask, allowed_port_caps); 372c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes return -EINVAL; 373c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes } 374c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes 375c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes if (mutex_lock_interruptible(&shca->modify_mutex)) 37691f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes return -ERESTARTSYS; 377c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes 378c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); 379c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes if (!rblock) { 380c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes ehca_err(&shca->ib_device, "Can't allocate rblock memory."); 381c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes ret = -ENOMEM; 382c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes goto modify_port1; 383c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes } 384c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes 3852b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen hret = hipz_h_query_port(shca->ipz_hca_handle, port, rblock); 3862b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen if (hret != H_SUCCESS) { 387c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes ehca_err(&shca->ib_device, "Can't query port properties"); 388c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes ret = -EINVAL; 389c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes goto modify_port2; 390c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes } 391c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes 392c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes cap = (rblock->capability_mask | props->set_port_cap_mask) 393c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes & ~props->clr_port_cap_mask; 394c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes 395c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes hret = hipz_h_modify_port(shca->ipz_hca_handle, port, 396c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes cap, props->init_type, port_modify_mask); 397c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes if (hret != H_SUCCESS) { 3983750f60557b68776eb749859ad68af70d1a01ad0Stephen Rothwell ehca_err(&shca->ib_device, "Modify port failed h_ret=%lli", 3992b94397adc68c2f0f851539884cc426e03444a26Hoang-Nam Nguyen hret); 400c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes ret = -EINVAL; 401c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes } 402c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes 403c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkesmodify_port2: 404c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes ehca_free_fw_ctrlblock(rblock); 405c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes 406c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkesmodify_port1: 40791f13aa3fc22e357b494c5b8270e94543870928dJoachim Fenkes mutex_unlock(&shca->modify_mutex); 408c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes 409c4ed790dfd4b2182c76e0fcd79d4aa85ab02eccfJoachim Fenkes return ret; 410fab97220c9e409a98b1956ba677ddd2dd43b0b95Heiko J Schick} 411