verbs.c revision bf6a9e31cfa768ce0a8e18474b3ca808641d9243
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 2004 Mellanox Technologies Ltd. All rights reserved. 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 2004 Infinicon Corporation. All rights reserved. 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 2004 Intel Corporation. All rights reserved. 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 2004 Topspin Corporation. All rights reserved. 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 2004 Voltaire Corporation. All rights reserved. 72a1d9b7f09aaaacf235656cb32a40ba2c79590b3Roland Dreier * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved. 833b9b3ee9709b19c4f02ab91571d53540d05c3d1Roland Dreier * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved. 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This software is available to you under a choice of one of two 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * licenses. You may choose to be licensed under the terms of the GNU 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * General Public License (GPL) Version 2, available from the file 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * COPYING in the main directory of this source tree, or the 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OpenIB.org BSD license below: 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Redistribution and use in source and binary forms, with or 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * without modification, are permitted provided that the following 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * conditions are met: 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - Redistributions of source code must retain the above 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * copyright notice, this list of conditions and the following 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * disclaimer. 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - Redistributions in binary form must reproduce the above 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * copyright notice, this list of conditions and the following 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * disclaimer in the documentation and/or other materials 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * provided with the distribution. 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SOFTWARE. 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * $Id: verbs.c 1349 2004-12-16 21:09:43Z roland $ 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/errno.h> 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/err.h> 438c65b4a60450590e79a28e9717ceffa9e4debb3fTim Schmielau#include <linux/string.h> 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 45a4d61e84804f3b14cc35c5e2af768a07c0f64ef6Roland Dreier#include <rdma/ib_verbs.h> 46a4d61e84804f3b14cc35c5e2af768a07c0f64ef6Roland Dreier#include <rdma/ib_cache.h> 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 48bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgensteinint ib_rate_to_mult(enum ib_rate rate) 49bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein{ 50bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein switch (rate) { 51bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case IB_RATE_2_5_GBPS: return 1; 52bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case IB_RATE_5_GBPS: return 2; 53bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case IB_RATE_10_GBPS: return 4; 54bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case IB_RATE_20_GBPS: return 8; 55bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case IB_RATE_30_GBPS: return 12; 56bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case IB_RATE_40_GBPS: return 16; 57bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case IB_RATE_60_GBPS: return 24; 58bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case IB_RATE_80_GBPS: return 32; 59bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case IB_RATE_120_GBPS: return 48; 60bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein default: return -1; 61bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein } 62bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein} 63bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack MorgensteinEXPORT_SYMBOL(ib_rate_to_mult); 64bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein 65bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgensteinenum ib_rate mult_to_ib_rate(int mult) 66bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein{ 67bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein switch (mult) { 68bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case 1: return IB_RATE_2_5_GBPS; 69bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case 2: return IB_RATE_5_GBPS; 70bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case 4: return IB_RATE_10_GBPS; 71bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case 8: return IB_RATE_20_GBPS; 72bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case 12: return IB_RATE_30_GBPS; 73bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case 16: return IB_RATE_40_GBPS; 74bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case 24: return IB_RATE_60_GBPS; 75bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case 32: return IB_RATE_80_GBPS; 76bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein case 48: return IB_RATE_120_GBPS; 77bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein default: return IB_RATE_PORT_CURRENT; 78bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein } 79bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein} 80bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack MorgensteinEXPORT_SYMBOL(mult_to_ib_rate); 81bf6a9e31cfa768ce0a8e18474b3ca808641d9243Jack Morgenstein 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Protection domains */ 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_pd *ib_alloc_pd(struct ib_device *device) 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd; 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 88b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier pd = device->alloc_pd(device, NULL, NULL); 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(pd)) { 91b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier pd->device = device; 92b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier pd->uobject = NULL; 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_set(&pd->usecnt, 0); 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pd; 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_alloc_pd); 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_dealloc_pd(struct ib_pd *pd) 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (atomic_read(&pd->usecnt)) 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EBUSY; 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pd->device->dealloc_pd(pd); 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_dealloc_pd); 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Address handles */ 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_ah *ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr) 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_ah *ah; 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ah = pd->device->create_ah(pd, ah_attr); 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(ah)) { 118b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier ah->device = pd->device; 119b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier ah->pd = pd; 120b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier ah->uobject = NULL; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&pd->usecnt); 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ah; 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_create_ah); 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 128513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstockstruct ib_ah *ib_create_ah_from_wc(struct ib_pd *pd, struct ib_wc *wc, 129513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock struct ib_grh *grh, u8 port_num) 130513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock{ 131513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock struct ib_ah_attr ah_attr; 132513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock u32 flow_class; 133513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock u16 gid_index; 134513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock int ret; 135513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock 136513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock memset(&ah_attr, 0, sizeof ah_attr); 137513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock ah_attr.dlid = wc->slid; 138513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock ah_attr.sl = wc->sl; 139513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock ah_attr.src_path_bits = wc->dlid_path_bits; 140513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock ah_attr.port_num = port_num; 141513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock 142513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock if (wc->wc_flags & IB_WC_GRH) { 143513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock ah_attr.ah_flags = IB_AH_GRH; 1444f8448dfe8d3804fadad90c9b77494238b4a4eaeRalph Campbell ah_attr.grh.dgid = grh->sgid; 145513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock 1464f8448dfe8d3804fadad90c9b77494238b4a4eaeRalph Campbell ret = ib_find_cached_gid(pd->device, &grh->dgid, &port_num, 147513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock &gid_index); 148513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock if (ret) 149513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock return ERR_PTR(ret); 150513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock 151513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock ah_attr.grh.sgid_index = (u8) gid_index; 152497677ab940e637a41351dca6610bc4320abc8f1Hal Rosenstock flow_class = be32_to_cpu(grh->version_tclass_flow); 153513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock ah_attr.grh.flow_label = flow_class & 0xFFFFF; 154513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock ah_attr.grh.traffic_class = (flow_class >> 20) & 0xFF; 155513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock ah_attr.grh.hop_limit = grh->hop_limit; 156513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock } 157513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock 158513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock return ib_create_ah(pd, &ah_attr); 159513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock} 160513789ed995fb2ba72ba2a5bee53ea11d1170580Hal RosenstockEXPORT_SYMBOL(ib_create_ah_from_wc); 161513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_modify_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr) 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ah->device->modify_ah ? 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ah->device->modify_ah(ah, ah_attr) : 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds -ENOSYS; 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_modify_ah); 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_query_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr) 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ah->device->query_ah ? 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ah->device->query_ah(ah, ah_attr) : 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds -ENOSYS; 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_query_ah); 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_destroy_ah(struct ib_ah *ah) 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd; 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pd = ah->pd; 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = ah->device->destroy_ah(ah); 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!ret) 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&pd->usecnt); 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_destroy_ah); 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 192d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier/* Shared receive queues */ 193d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 194d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreierstruct ib_srq *ib_create_srq(struct ib_pd *pd, 195d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier struct ib_srq_init_attr *srq_init_attr) 196d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier{ 197d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier struct ib_srq *srq; 198d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 199d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier if (!pd->device->create_srq) 200d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier return ERR_PTR(-ENOSYS); 201d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 202d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq = pd->device->create_srq(pd, srq_init_attr, NULL); 203d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 204d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier if (!IS_ERR(srq)) { 205d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq->device = pd->device; 206d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq->pd = pd; 207d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq->uobject = NULL; 208d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq->event_handler = srq_init_attr->event_handler; 209d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq->srq_context = srq_init_attr->srq_context; 210d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier atomic_inc(&pd->usecnt); 211d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier atomic_set(&srq->usecnt, 0); 212d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier } 213d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 214d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier return srq; 215d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier} 216d41fcc6705eddd04f7218c985b6da35435ed73ccRoland DreierEXPORT_SYMBOL(ib_create_srq); 217d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 218d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreierint ib_modify_srq(struct ib_srq *srq, 219d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier struct ib_srq_attr *srq_attr, 220d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier enum ib_srq_attr_mask srq_attr_mask) 221d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier{ 222d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier return srq->device->modify_srq(srq, srq_attr, srq_attr_mask); 223d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier} 224d41fcc6705eddd04f7218c985b6da35435ed73ccRoland DreierEXPORT_SYMBOL(ib_modify_srq); 225d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 226d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreierint ib_query_srq(struct ib_srq *srq, 227d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier struct ib_srq_attr *srq_attr) 228d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier{ 229d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier return srq->device->query_srq ? 230d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq->device->query_srq(srq, srq_attr) : -ENOSYS; 231d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier} 232d41fcc6705eddd04f7218c985b6da35435ed73ccRoland DreierEXPORT_SYMBOL(ib_query_srq); 233d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 234d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreierint ib_destroy_srq(struct ib_srq *srq) 235d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier{ 236d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier struct ib_pd *pd; 237d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier int ret; 238d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 239d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier if (atomic_read(&srq->usecnt)) 240d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier return -EBUSY; 241d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 242d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier pd = srq->pd; 243d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 244d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier ret = srq->device->destroy_srq(srq); 245d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier if (!ret) 246d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier atomic_dec(&pd->usecnt); 247d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 248d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier return ret; 249d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier} 250d41fcc6705eddd04f7218c985b6da35435ed73ccRoland DreierEXPORT_SYMBOL(ib_destroy_srq); 251d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Queue pairs */ 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_qp *ib_create_qp(struct ib_pd *pd, 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_qp_init_attr *qp_init_attr) 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_qp *qp; 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 259b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier qp = pd->device->create_qp(pd, qp_init_attr, NULL); 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(qp)) { 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds qp->device = pd->device; 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds qp->pd = pd; 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds qp->send_cq = qp_init_attr->send_cq; 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds qp->recv_cq = qp_init_attr->recv_cq; 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds qp->srq = qp_init_attr->srq; 267b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier qp->uobject = NULL; 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds qp->event_handler = qp_init_attr->event_handler; 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds qp->qp_context = qp_init_attr->qp_context; 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds qp->qp_type = qp_init_attr->qp_type; 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&pd->usecnt); 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&qp_init_attr->send_cq->usecnt); 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&qp_init_attr->recv_cq->usecnt); 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (qp_init_attr->srq) 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&qp_init_attr->srq->usecnt); 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return qp; 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_create_qp); 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2828a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreierstatic const struct { 2838a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier int valid; 2848a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier enum ib_qp_attr_mask req_param[IB_QPT_RAW_ETY + 1]; 2858a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier enum ib_qp_attr_mask opt_param[IB_QPT_RAW_ETY + 1]; 2868a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier} qp_state_table[IB_QPS_ERR + 1][IB_QPS_ERR + 1] = { 2878a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { 2888a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 2898a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { .valid = 1 }, 2908a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_INIT] = { 2918a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 2928a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .req_param = { 2938a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_PKEY_INDEX | 2948a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PORT | 2958a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 2968a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_PKEY_INDEX | 2978a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PORT | 2988a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS), 2998a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_PKEY_INDEX | 3008a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PORT | 3018a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS), 3028a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_PKEY_INDEX | 3038a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 3048a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_PKEY_INDEX | 3058a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 3068a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 3078a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 3088a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 3098a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_INIT] = { 3108a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 3118a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { .valid = 1 }, 3128a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_INIT] = { 3138a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 3148a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 3158a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_PKEY_INDEX | 3168a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PORT | 3178a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 3188a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_PKEY_INDEX | 3198a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PORT | 3208a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS), 3218a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_PKEY_INDEX | 3228a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PORT | 3238a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS), 3248a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_PKEY_INDEX | 3258a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 3268a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_PKEY_INDEX | 3278a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 3288a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 3298a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 3308a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTR] = { 3318a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 3328a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .req_param = { 3338a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_AV | 3348a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MTU | 3358a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_DEST_QPN | 3368a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_RQ_PSN), 3378a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_AV | 3388a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MTU | 3398a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_DEST_QPN | 3408a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_RQ_PSN | 3418a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MAX_DEST_RD_ATOMIC | 3428a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MIN_RNR_TIMER), 3438a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 3448a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 3458a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_PKEY_INDEX | 3468a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 3478a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_ALT_PATH | 3488a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 3498a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PKEY_INDEX), 3508a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_ALT_PATH | 3518a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 3528a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PKEY_INDEX), 3538a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_PKEY_INDEX | 3548a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 3558a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_PKEY_INDEX | 3568a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 3578a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 3588a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 3598a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 3608a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTR] = { 3618a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 3628a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { .valid = 1 }, 3638a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTS] = { 3648a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 3658a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .req_param = { 3668a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = IB_QP_SQ_PSN, 3678a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = IB_QP_SQ_PSN, 3688a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_TIMEOUT | 3698a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_RETRY_CNT | 3708a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_RNR_RETRY | 3718a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_SQ_PSN | 3728a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MAX_QP_RD_ATOMIC), 3738a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = IB_QP_SQ_PSN, 3748a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = IB_QP_SQ_PSN, 3758a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 3768a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 3778a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_CUR_STATE | 3788a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 3798a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_CUR_STATE | 3808a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 3818a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 3828a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 3838a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_CUR_STATE | 3848a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 3858a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 3868a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MIN_RNR_TIMER | 3878a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 3888a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_CUR_STATE | 3898a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 3908a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_CUR_STATE | 3918a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 3928a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 3938a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 3948a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 3958a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTS] = { 3968a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 3978a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { .valid = 1 }, 3988a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTS] = { 3998a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 4008a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 4018a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_CUR_STATE | 4028a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 4034546d31d84beafe74c56651173ac4fe197c7de8bDotan Barak [IB_QPT_UC] = (IB_QP_CUR_STATE | 4044546d31d84beafe74c56651173ac4fe197c7de8bDotan Barak IB_QP_ACCESS_FLAGS | 4058a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 4068a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 4074546d31d84beafe74c56651173ac4fe197c7de8bDotan Barak [IB_QPT_RC] = (IB_QP_CUR_STATE | 4084546d31d84beafe74c56651173ac4fe197c7de8bDotan Barak IB_QP_ACCESS_FLAGS | 4098a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 4108a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE | 4118a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MIN_RNR_TIMER), 4128a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_CUR_STATE | 4138a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 4148a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_CUR_STATE | 4158a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 4168a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 4178a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 4188a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_SQD] = { 4198a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 4208a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 4218a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = IB_QP_EN_SQD_ASYNC_NOTIFY, 4228a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = IB_QP_EN_SQD_ASYNC_NOTIFY, 4238a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = IB_QP_EN_SQD_ASYNC_NOTIFY, 4248a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = IB_QP_EN_SQD_ASYNC_NOTIFY, 4258a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = IB_QP_EN_SQD_ASYNC_NOTIFY 4268a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 4278a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 4288a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 4298a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_SQD] = { 4308a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 4318a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { .valid = 1 }, 4328a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTS] = { 4338a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 4348a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 4358a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_CUR_STATE | 4368a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 4378a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_CUR_STATE | 4388a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 4398a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 4408a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 4418a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_CUR_STATE | 4428a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 4438a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 4448a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MIN_RNR_TIMER | 4458a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 4468a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_CUR_STATE | 4478a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 4488a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_CUR_STATE | 4498a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 4508a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 4518a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 4528a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_SQD] = { 4538a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 4548a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 4558a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_PKEY_INDEX | 4568a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 4578a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_AV | 4588a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 4598a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 4608a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PKEY_INDEX | 4618a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 4628a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_PORT | 4638a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_AV | 4648a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_TIMEOUT | 4658a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_RETRY_CNT | 4668a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_RNR_RETRY | 4678a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MAX_QP_RD_ATOMIC | 4688a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MAX_DEST_RD_ATOMIC | 4698a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 4708a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 4718a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PKEY_INDEX | 4728a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MIN_RNR_TIMER | 4738a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 4748a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_PKEY_INDEX | 4758a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 4768a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_PKEY_INDEX | 4778a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 4788a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 4798a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 4808a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 4818a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_SQE] = { 4828a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 4838a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { .valid = 1 }, 4848a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTS] = { 4858a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 4868a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 4878a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_CUR_STATE | 4888a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 4898a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_CUR_STATE | 4908a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS), 4918a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_CUR_STATE | 4928a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 4938a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_CUR_STATE | 4948a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 4958a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 4968a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 4978a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 4988a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { 4998a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 5008a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { .valid = 1 } 5018a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 5028a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier}; 5038a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 5048a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreierint ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state, 5058a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier enum ib_qp_type type, enum ib_qp_attr_mask mask) 5068a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier{ 5078a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier enum ib_qp_attr_mask req_param, opt_param; 5088a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 5098a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier if (cur_state < 0 || cur_state > IB_QPS_ERR || 5108a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier next_state < 0 || next_state > IB_QPS_ERR) 5118a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier return 0; 5128a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 5138a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier if (mask & IB_QP_CUR_STATE && 5148a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier cur_state != IB_QPS_RTR && cur_state != IB_QPS_RTS && 5158a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier cur_state != IB_QPS_SQD && cur_state != IB_QPS_SQE) 5168a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier return 0; 5178a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 5188a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier if (!qp_state_table[cur_state][next_state].valid) 5198a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier return 0; 5208a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 5218a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier req_param = qp_state_table[cur_state][next_state].req_param[type]; 5228a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier opt_param = qp_state_table[cur_state][next_state].opt_param[type]; 5238a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 5248a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier if ((mask & req_param) != req_param) 5258a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier return 0; 5268a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 5278a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier if (mask & ~(req_param | opt_param | IB_QP_STATE)) 5288a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier return 0; 5298a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 5308a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier return 1; 5318a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier} 5328a51866f08103ba04894ce0f65eef567ddc3ed40Roland DreierEXPORT_SYMBOL(ib_modify_qp_is_ok); 5338a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_modify_qp(struct ib_qp *qp, 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_qp_attr *qp_attr, 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int qp_attr_mask) 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return qp->device->modify_qp(qp, qp_attr, qp_attr_mask); 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_modify_qp); 5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_query_qp(struct ib_qp *qp, 5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_qp_attr *qp_attr, 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int qp_attr_mask, 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_qp_init_attr *qp_init_attr) 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return qp->device->query_qp ? 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds qp->device->query_qp(qp, qp_attr, qp_attr_mask, qp_init_attr) : 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds -ENOSYS; 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_query_qp); 5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_destroy_qp(struct ib_qp *qp) 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd; 5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_cq *scq, *rcq; 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_srq *srq; 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pd = qp->pd; 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds scq = qp->send_cq; 5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds rcq = qp->recv_cq; 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds srq = qp->srq; 5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = qp->device->destroy_qp(qp); 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!ret) { 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&pd->usecnt); 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&scq->usecnt); 5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&rcq->usecnt); 5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (srq) 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&srq->usecnt); 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_destroy_qp); 5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Completion queues */ 5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_cq *ib_create_cq(struct ib_device *device, 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ib_comp_handler comp_handler, 5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void (*event_handler)(struct ib_event *, void *), 5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void *cq_context, int cqe) 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_cq *cq; 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 587b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier cq = device->create_cq(device, cqe, NULL, NULL); 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(cq)) { 5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cq->device = device; 591b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier cq->uobject = NULL; 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cq->comp_handler = comp_handler; 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cq->event_handler = event_handler; 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cq->cq_context = cq_context; 5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_set(&cq->usecnt, 0); 5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return cq; 5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_create_cq); 6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_destroy_cq(struct ib_cq *cq) 6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (atomic_read(&cq->usecnt)) 6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EBUSY; 6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return cq->device->destroy_cq(cq); 6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_destroy_cq); 6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 611a74cd4af0bfa9578594acbb711a958104c93b772Roland Dreierint ib_resize_cq(struct ib_cq *cq, int cqe) 6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 61340de2e548c225e3ef859e3c60de9785e37e1b5b1Roland Dreier return cq->device->resize_cq ? 61433b9b3ee9709b19c4f02ab91571d53540d05c3d1Roland Dreier cq->device->resize_cq(cq, cqe, NULL) : -ENOSYS; 6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_resize_cq); 6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Memory regions */ 6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_mr *ib_get_dma_mr(struct ib_pd *pd, int mr_access_flags) 6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_mr *mr; 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mr = pd->device->get_dma_mr(pd, mr_access_flags); 6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(mr)) { 627b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mr->device = pd->device; 628b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mr->pd = pd; 629b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mr->uobject = NULL; 6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&pd->usecnt); 6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_set(&mr->usecnt, 0); 6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return mr; 6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_get_dma_mr); 6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_mr *ib_reg_phys_mr(struct ib_pd *pd, 6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_phys_buf *phys_buf_array, 6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int num_phys_buf, 6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int mr_access_flags, 6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 *iova_start) 6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_mr *mr; 6451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mr = pd->device->reg_phys_mr(pd, phys_buf_array, num_phys_buf, 6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mr_access_flags, iova_start); 6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(mr)) { 650b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mr->device = pd->device; 651b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mr->pd = pd; 652b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mr->uobject = NULL; 6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&pd->usecnt); 6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_set(&mr->usecnt, 0); 6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return mr; 6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_reg_phys_mr); 6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_rereg_phys_mr(struct ib_mr *mr, 6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int mr_rereg_mask, 6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd, 6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_phys_buf *phys_buf_array, 6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int num_phys_buf, 6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int mr_access_flags, 6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 *iova_start) 6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *old_pd; 6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!mr->device->rereg_phys_mr) 6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOSYS; 6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (atomic_read(&mr->usecnt)) 6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EBUSY; 6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds old_pd = mr->pd; 6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = mr->device->rereg_phys_mr(mr, mr_rereg_mask, pd, 6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds phys_buf_array, num_phys_buf, 6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mr_access_flags, iova_start); 6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!ret && (mr_rereg_mask & IB_MR_REREG_PD)) { 6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&old_pd->usecnt); 6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&pd->usecnt); 6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_rereg_phys_mr); 6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_query_mr(struct ib_mr *mr, struct ib_mr_attr *mr_attr) 6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return mr->device->query_mr ? 6961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mr->device->query_mr(mr, mr_attr) : -ENOSYS; 6971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_query_mr); 6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_dereg_mr(struct ib_mr *mr) 7011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd; 7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (atomic_read(&mr->usecnt)) 7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EBUSY; 7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pd = mr->pd; 7091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = mr->device->dereg_mr(mr); 7101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!ret) 7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&pd->usecnt); 7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_dereg_mr); 7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Memory windows */ 7181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_mw *ib_alloc_mw(struct ib_pd *pd) 7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_mw *mw; 7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!pd->device->alloc_mw) 7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ERR_PTR(-ENOSYS); 7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mw = pd->device->alloc_mw(pd); 7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(mw)) { 728b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mw->device = pd->device; 729b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mw->pd = pd; 730b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mw->uobject = NULL; 7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&pd->usecnt); 7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return mw; 7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_alloc_mw); 7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_dealloc_mw(struct ib_mw *mw) 7391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd; 7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 7421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pd = mw->pd; 7441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = mw->device->dealloc_mw(mw); 7451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!ret) 7461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&pd->usecnt); 7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 7491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_dealloc_mw); 7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* "Fast" memory regions */ 7531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_fmr *ib_alloc_fmr(struct ib_pd *pd, 7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int mr_access_flags, 7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_fmr_attr *fmr_attr) 7571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_fmr *fmr; 7591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!pd->device->alloc_fmr) 7611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ERR_PTR(-ENOSYS); 7621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmr = pd->device->alloc_fmr(pd, mr_access_flags, fmr_attr); 7641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(fmr)) { 7651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmr->device = pd->device; 7661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmr->pd = pd; 7671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&pd->usecnt); 7681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return fmr; 7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_alloc_fmr); 7731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_unmap_fmr(struct list_head *fmr_list) 7751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_fmr *fmr; 7771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (list_empty(fmr_list)) 7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmr = list_entry(fmr_list->next, struct ib_fmr, list); 7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return fmr->device->unmap_fmr(fmr_list); 7831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_unmap_fmr); 7851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_dealloc_fmr(struct ib_fmr *fmr) 7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd; 7891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pd = fmr->pd; 7921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = fmr->device->dealloc_fmr(fmr); 7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!ret) 7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&pd->usecnt); 7951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 7971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_dealloc_fmr); 7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Multicast groups */ 8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_attach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid) 8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8040c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein if (!qp->device->attach_mcast) 8050c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein return -ENOSYS; 8060c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD) 8070c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein return -EINVAL; 8080c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein 8090c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein return qp->device->attach_mcast(qp, gid, lid); 8101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_attach_mcast); 8121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_detach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid) 8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8150c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein if (!qp->device->detach_mcast) 8160c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein return -ENOSYS; 8170c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD) 8180c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein return -EINVAL; 8190c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein 8200c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein return qp->device->detach_mcast(qp, gid, lid); 8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_detach_mcast); 823