verbs.c revision 5db5765e255de4072eb0e35facfeafce53af001b
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 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/errno.h> 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/err.h> 41b108d9764cff25262bf764542ed1998d3e568962Paul Gortmaker#include <linux/export.h> 428c65b4a60450590e79a28e9717ceffa9e4debb3fTim Schmielau#include <linux/string.h> 430e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty#include <linux/slab.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 8271eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaumint ib_rate_to_mbps(enum ib_rate rate) 8371eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum{ 8471eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum switch (rate) { 8571eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_2_5_GBPS: return 2500; 8671eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_5_GBPS: return 5000; 8771eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_10_GBPS: return 10000; 8871eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_20_GBPS: return 20000; 8971eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_30_GBPS: return 30000; 9071eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_40_GBPS: return 40000; 9171eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_60_GBPS: return 60000; 9271eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_80_GBPS: return 80000; 9371eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_120_GBPS: return 120000; 9471eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_14_GBPS: return 14062; 9571eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_56_GBPS: return 56250; 9671eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_112_GBPS: return 112500; 9771eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_168_GBPS: return 168750; 9871eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_25_GBPS: return 25781; 9971eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_100_GBPS: return 103125; 10071eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_200_GBPS: return 206250; 10171eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum case IB_RATE_300_GBPS: return 309375; 10271eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum default: return -1; 10371eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum } 10471eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum} 10571eeba161d7611238ecb6f525a82325aa35339f0Marcel ApfelbaumEXPORT_SYMBOL(ib_rate_to_mbps); 10671eeba161d7611238ecb6f525a82325aa35339f0Marcel Apfelbaum 10707ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tuckerenum rdma_transport_type 10807ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tuckerrdma_node_get_transport(enum rdma_node_type node_type) 10907ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker{ 11007ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker switch (node_type) { 11107ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker case RDMA_NODE_IB_CA: 11207ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker case RDMA_NODE_IB_SWITCH: 11307ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker case RDMA_NODE_IB_ROUTER: 11407ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker return RDMA_TRANSPORT_IB; 11507ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker case RDMA_NODE_RNIC: 11607ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker return RDMA_TRANSPORT_IWARP; 117180771a3707a4c0577cbf4f830c754dbabfdfccbUpinder Malhi \(umalhi\) case RDMA_NODE_USNIC: 1185db5765e255de4072eb0e35facfeafce53af001bUpinder Malhi return RDMA_TRANSPORT_USNIC; 1195db5765e255de4072eb0e35facfeafce53af001bUpinder Malhi case RDMA_NODE_USNIC_UDP: 120248567f79304b953ea492fb92ade097b62ed09b2Upinder Malhi return RDMA_TRANSPORT_USNIC_UDP; 12107ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker default: 12207ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker BUG(); 12307ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker return 0; 12407ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker } 12507ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker} 12607ebafbaaa72aa6a35472879008f5a1d1d469a0cTom TuckerEXPORT_SYMBOL(rdma_node_get_transport); 12707ebafbaaa72aa6a35472879008f5a1d1d469a0cTom Tucker 128a3f5adaf491490089215f863a61b9422fae902f8Eli Cohenenum rdma_link_layer rdma_port_get_link_layer(struct ib_device *device, u8 port_num) 129a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen{ 130a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen if (device->get_link_layer) 131a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen return device->get_link_layer(device, port_num); 132a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen 133a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen switch (rdma_node_get_transport(device->node_type)) { 134a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen case RDMA_TRANSPORT_IB: 135a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen return IB_LINK_LAYER_INFINIBAND; 136a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen case RDMA_TRANSPORT_IWARP: 137180771a3707a4c0577cbf4f830c754dbabfdfccbUpinder Malhi \(umalhi\) case RDMA_TRANSPORT_USNIC: 138248567f79304b953ea492fb92ade097b62ed09b2Upinder Malhi case RDMA_TRANSPORT_USNIC_UDP: 139a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen return IB_LINK_LAYER_ETHERNET; 140a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen default: 141a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen return IB_LINK_LAYER_UNSPECIFIED; 142a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen } 143a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen} 144a3f5adaf491490089215f863a61b9422fae902f8Eli CohenEXPORT_SYMBOL(rdma_port_get_link_layer); 145a3f5adaf491490089215f863a61b9422fae902f8Eli Cohen 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Protection domains */ 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_pd *ib_alloc_pd(struct ib_device *device) 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd; 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 152b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier pd = device->alloc_pd(device, NULL, NULL); 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(pd)) { 155b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier pd->device = device; 156b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier pd->uobject = NULL; 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_set(&pd->usecnt, 0); 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pd; 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_alloc_pd); 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_dealloc_pd(struct ib_pd *pd) 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (atomic_read(&pd->usecnt)) 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EBUSY; 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pd->device->dealloc_pd(pd); 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_dealloc_pd); 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Address handles */ 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_ah *ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr) 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_ah *ah; 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ah = pd->device->create_ah(pd, ah_attr); 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(ah)) { 182b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier ah->device = pd->device; 183b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier ah->pd = pd; 184b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier ah->uobject = NULL; 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&pd->usecnt); 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ah; 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_create_ah); 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1924e00d69454a8747798de11dc4eeef1edeee5ce98Sean Heftyint ib_init_ah_from_wc(struct ib_device *device, u8 port_num, struct ib_wc *wc, 1934e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty struct ib_grh *grh, struct ib_ah_attr *ah_attr) 194513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock{ 195513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock u32 flow_class; 196513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock u16 gid_index; 197513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock int ret; 198513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock 1994e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty memset(ah_attr, 0, sizeof *ah_attr); 2004e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty ah_attr->dlid = wc->slid; 2014e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty ah_attr->sl = wc->sl; 2024e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty ah_attr->src_path_bits = wc->dlid_path_bits; 2034e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty ah_attr->port_num = port_num; 204513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock 205513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock if (wc->wc_flags & IB_WC_GRH) { 2064e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty ah_attr->ah_flags = IB_AH_GRH; 2074e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty ah_attr->grh.dgid = grh->sgid; 208513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock 2094e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty ret = ib_find_cached_gid(device, &grh->dgid, &port_num, 210513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock &gid_index); 211513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock if (ret) 2124e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty return ret; 213513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock 2144e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty ah_attr->grh.sgid_index = (u8) gid_index; 215497677ab940e637a41351dca6610bc4320abc8f1Hal Rosenstock flow_class = be32_to_cpu(grh->version_tclass_flow); 2164e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty ah_attr->grh.flow_label = flow_class & 0xFFFFF; 21747645d8d25387c08bb3ccd84e1405c3776f21d24Sean Hefty ah_attr->grh.hop_limit = 0xFF; 2184e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty ah_attr->grh.traffic_class = (flow_class >> 20) & 0xFF; 219513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock } 2204e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty return 0; 2214e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty} 2224e00d69454a8747798de11dc4eeef1edeee5ce98Sean HeftyEXPORT_SYMBOL(ib_init_ah_from_wc); 2234e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty 2244e00d69454a8747798de11dc4eeef1edeee5ce98Sean Heftystruct ib_ah *ib_create_ah_from_wc(struct ib_pd *pd, struct ib_wc *wc, 2254e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty struct ib_grh *grh, u8 port_num) 2264e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty{ 2274e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty struct ib_ah_attr ah_attr; 2284e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty int ret; 2294e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty 2304e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty ret = ib_init_ah_from_wc(pd->device, port_num, wc, grh, &ah_attr); 2314e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty if (ret) 2324e00d69454a8747798de11dc4eeef1edeee5ce98Sean Hefty return ERR_PTR(ret); 233513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock 234513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock return ib_create_ah(pd, &ah_attr); 235513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock} 236513789ed995fb2ba72ba2a5bee53ea11d1170580Hal RosenstockEXPORT_SYMBOL(ib_create_ah_from_wc); 237513789ed995fb2ba72ba2a5bee53ea11d1170580Hal Rosenstock 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_modify_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr) 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ah->device->modify_ah ? 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ah->device->modify_ah(ah, ah_attr) : 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds -ENOSYS; 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_modify_ah); 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_query_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr) 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ah->device->query_ah ? 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ah->device->query_ah(ah, ah_attr) : 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds -ENOSYS; 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_query_ah); 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_destroy_ah(struct ib_ah *ah) 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd; 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pd = ah->pd; 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = ah->device->destroy_ah(ah); 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!ret) 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&pd->usecnt); 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_destroy_ah); 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 268d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier/* Shared receive queues */ 269d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 270d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreierstruct ib_srq *ib_create_srq(struct ib_pd *pd, 271d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier struct ib_srq_init_attr *srq_init_attr) 272d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier{ 273d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier struct ib_srq *srq; 274d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 275d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier if (!pd->device->create_srq) 276d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier return ERR_PTR(-ENOSYS); 277d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 278d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq = pd->device->create_srq(pd, srq_init_attr, NULL); 279d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 280d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier if (!IS_ERR(srq)) { 281d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq->device = pd->device; 282d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq->pd = pd; 283d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq->uobject = NULL; 284d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq->event_handler = srq_init_attr->event_handler; 285d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq->srq_context = srq_init_attr->srq_context; 28696104eda01695a26da2c8f7423ec0ba3509c8c97Sean Hefty srq->srq_type = srq_init_attr->srq_type; 287418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty if (srq->srq_type == IB_SRQT_XRC) { 288418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty srq->ext.xrc.xrcd = srq_init_attr->ext.xrc.xrcd; 289418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty srq->ext.xrc.cq = srq_init_attr->ext.xrc.cq; 290418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty atomic_inc(&srq->ext.xrc.xrcd->usecnt); 291418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty atomic_inc(&srq->ext.xrc.cq->usecnt); 292418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty } 293d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier atomic_inc(&pd->usecnt); 294d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier atomic_set(&srq->usecnt, 0); 295d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier } 296d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 297d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier return srq; 298d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier} 299d41fcc6705eddd04f7218c985b6da35435ed73ccRoland DreierEXPORT_SYMBOL(ib_create_srq); 300d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 301d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreierint ib_modify_srq(struct ib_srq *srq, 302d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier struct ib_srq_attr *srq_attr, 303d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier enum ib_srq_attr_mask srq_attr_mask) 304d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier{ 3057ce5eacb45a7c819a6bec6ed486f27db9aab6ab6Dotan Barak return srq->device->modify_srq ? 3067ce5eacb45a7c819a6bec6ed486f27db9aab6ab6Dotan Barak srq->device->modify_srq(srq, srq_attr, srq_attr_mask, NULL) : 3077ce5eacb45a7c819a6bec6ed486f27db9aab6ab6Dotan Barak -ENOSYS; 308d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier} 309d41fcc6705eddd04f7218c985b6da35435ed73ccRoland DreierEXPORT_SYMBOL(ib_modify_srq); 310d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 311d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreierint ib_query_srq(struct ib_srq *srq, 312d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier struct ib_srq_attr *srq_attr) 313d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier{ 314d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier return srq->device->query_srq ? 315d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier srq->device->query_srq(srq, srq_attr) : -ENOSYS; 316d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier} 317d41fcc6705eddd04f7218c985b6da35435ed73ccRoland DreierEXPORT_SYMBOL(ib_query_srq); 318d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 319d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreierint ib_destroy_srq(struct ib_srq *srq) 320d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier{ 321d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier struct ib_pd *pd; 322418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty enum ib_srq_type srq_type; 323418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty struct ib_xrcd *uninitialized_var(xrcd); 324418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty struct ib_cq *uninitialized_var(cq); 325d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier int ret; 326d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 327d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier if (atomic_read(&srq->usecnt)) 328d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier return -EBUSY; 329d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 330d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier pd = srq->pd; 331418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty srq_type = srq->srq_type; 332418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty if (srq_type == IB_SRQT_XRC) { 333418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty xrcd = srq->ext.xrc.xrcd; 334418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty cq = srq->ext.xrc.cq; 335418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty } 336d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 337d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier ret = srq->device->destroy_srq(srq); 338418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty if (!ret) { 339d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier atomic_dec(&pd->usecnt); 340418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty if (srq_type == IB_SRQT_XRC) { 341418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty atomic_dec(&xrcd->usecnt); 342418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty atomic_dec(&cq->usecnt); 343418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty } 344418d51307d102e72e745031adb4f5ba0ddb646e2Sean Hefty } 345d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 346d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier return ret; 347d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier} 348d41fcc6705eddd04f7218c985b6da35435ed73ccRoland DreierEXPORT_SYMBOL(ib_destroy_srq); 349d41fcc6705eddd04f7218c985b6da35435ed73ccRoland Dreier 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Queue pairs */ 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3520e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Heftystatic void __ib_shared_qp_event_handler(struct ib_event *event, void *context) 3530e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty{ 3540e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty struct ib_qp *qp = context; 35573c40c616a33fcb7961b3c90a91b550813129b3eYishai Hadas unsigned long flags; 3560e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 35773c40c616a33fcb7961b3c90a91b550813129b3eYishai Hadas spin_lock_irqsave(&qp->device->event_handler_lock, flags); 3580e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty list_for_each_entry(event->element.qp, &qp->open_list, open_list) 359eec9e29fc5e9b417649830ab76a3aa10b90d2e9fShlomo Pongratz if (event->element.qp->event_handler) 360eec9e29fc5e9b417649830ab76a3aa10b90d2e9fShlomo Pongratz event->element.qp->event_handler(event, event->element.qp->qp_context); 36173c40c616a33fcb7961b3c90a91b550813129b3eYishai Hadas spin_unlock_irqrestore(&qp->device->event_handler_lock, flags); 3620e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty} 3630e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 364d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Heftystatic void __ib_insert_xrcd_qp(struct ib_xrcd *xrcd, struct ib_qp *qp) 365d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty{ 366d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty mutex_lock(&xrcd->tgt_qp_mutex); 367d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty list_add(&qp->xrcd_list, &xrcd->tgt_qp_list); 368d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty mutex_unlock(&xrcd->tgt_qp_mutex); 369d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty} 370d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty 3710e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Heftystatic struct ib_qp *__ib_open_qp(struct ib_qp *real_qp, 3720e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty void (*event_handler)(struct ib_event *, void *), 3730e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty void *qp_context) 374d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty{ 3750e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty struct ib_qp *qp; 3760e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty unsigned long flags; 3770e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 3780e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp = kzalloc(sizeof *qp, GFP_KERNEL); 3790e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty if (!qp) 3800e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty return ERR_PTR(-ENOMEM); 3810e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 3820e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->real_qp = real_qp; 3830e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty atomic_inc(&real_qp->usecnt); 3840e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->device = real_qp->device; 3850e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->event_handler = event_handler; 3860e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->qp_context = qp_context; 3870e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->qp_num = real_qp->qp_num; 3880e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->qp_type = real_qp->qp_type; 3890e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 3900e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty spin_lock_irqsave(&real_qp->device->event_handler_lock, flags); 3910e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty list_add(&qp->open_list, &real_qp->open_list); 3920e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty spin_unlock_irqrestore(&real_qp->device->event_handler_lock, flags); 3930e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 3940e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty return qp; 3950e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty} 3960e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 3970e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Heftystruct ib_qp *ib_open_qp(struct ib_xrcd *xrcd, 3980e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty struct ib_qp_open_attr *qp_open_attr) 3990e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty{ 4000e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty struct ib_qp *qp, *real_qp; 4010e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 4020e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty if (qp_open_attr->qp_type != IB_QPT_XRC_TGT) 4030e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty return ERR_PTR(-EINVAL); 4040e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 4050e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp = ERR_PTR(-EINVAL); 406d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty mutex_lock(&xrcd->tgt_qp_mutex); 4070e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty list_for_each_entry(real_qp, &xrcd->tgt_qp_list, xrcd_list) { 4080e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty if (real_qp->qp_num == qp_open_attr->qp_num) { 4090e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp = __ib_open_qp(real_qp, qp_open_attr->event_handler, 4100e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp_open_attr->qp_context); 4110e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty break; 4120e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty } 4130e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty } 414d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty mutex_unlock(&xrcd->tgt_qp_mutex); 4150e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty return qp; 416d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty} 4170e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean HeftyEXPORT_SYMBOL(ib_open_qp); 418d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_qp *ib_create_qp(struct ib_pd *pd, 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_qp_init_attr *qp_init_attr) 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4220e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty struct ib_qp *qp, *real_qp; 423b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty struct ib_device *device; 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 425b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty device = pd ? pd->device : qp_init_attr->xrcd->device; 426b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty qp = device->create_qp(pd, qp_init_attr, NULL); 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(qp)) { 4290e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->device = device; 4300e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->real_qp = qp; 4310e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->uobject = NULL; 4320e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->qp_type = qp_init_attr->qp_type; 433b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty 434e47e321a35c741ee41b67976f8c6a3a7a42bc5c0Bernd Schubert atomic_set(&qp->usecnt, 0); 435b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty if (qp_init_attr->qp_type == IB_QPT_XRC_TGT) { 4360e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->event_handler = __ib_shared_qp_event_handler; 4370e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->qp_context = qp; 438b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty qp->pd = NULL; 439b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty qp->send_cq = qp->recv_cq = NULL; 440b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty qp->srq = NULL; 441b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty qp->xrcd = qp_init_attr->xrcd; 442b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty atomic_inc(&qp_init_attr->xrcd->usecnt); 4430e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty INIT_LIST_HEAD(&qp->open_list); 4440e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 4450e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty real_qp = qp; 4460e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp = __ib_open_qp(real_qp, qp_init_attr->event_handler, 4470e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp_init_attr->qp_context); 4480e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty if (!IS_ERR(qp)) 4490e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty __ib_insert_xrcd_qp(qp_init_attr->xrcd, real_qp); 4500e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty else 4510e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty real_qp->device->destroy_qp(real_qp); 452b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty } else { 4530e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->event_handler = qp_init_attr->event_handler; 4540e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->qp_context = qp_init_attr->qp_context; 455b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty if (qp_init_attr->qp_type == IB_QPT_XRC_INI) { 456b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty qp->recv_cq = NULL; 457b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty qp->srq = NULL; 458b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty } else { 459b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty qp->recv_cq = qp_init_attr->recv_cq; 460b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty atomic_inc(&qp_init_attr->recv_cq->usecnt); 461b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty qp->srq = qp_init_attr->srq; 462b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty if (qp->srq) 463b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty atomic_inc(&qp_init_attr->srq->usecnt); 464b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty } 465b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty 466b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty qp->pd = pd; 467b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty qp->send_cq = qp_init_attr->send_cq; 468b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty qp->xrcd = NULL; 469b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty 470b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty atomic_inc(&pd->usecnt); 471b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty atomic_inc(&qp_init_attr->send_cq->usecnt); 472b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty } 4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return qp; 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_create_qp); 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4798a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreierstatic const struct { 4808a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier int valid; 481b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty enum ib_qp_attr_mask req_param[IB_QPT_MAX]; 482b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty enum ib_qp_attr_mask opt_param[IB_QPT_MAX]; 4838a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier} qp_state_table[IB_QPS_ERR + 1][IB_QPS_ERR + 1] = { 4848a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { 4858a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 4868a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_INIT] = { 4878a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 4888a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .req_param = { 4898a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_PKEY_INDEX | 4908a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PORT | 4918a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 492c938a616aadb621b8e26b0ac09ac13d053c7ed1cOr Gerlitz [IB_QPT_RAW_PACKET] = IB_QP_PORT, 4938a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_PKEY_INDEX | 4948a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PORT | 4958a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS), 4968a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_PKEY_INDEX | 4978a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PORT | 4988a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS), 499b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_INI] = (IB_QP_PKEY_INDEX | 500b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PORT | 501b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS), 502b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_TGT] = (IB_QP_PKEY_INDEX | 503b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PORT | 504b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS), 5058a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_PKEY_INDEX | 5068a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 5078a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_PKEY_INDEX | 5088a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 5098a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 5108a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 5118a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 5128a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_INIT] = { 5138a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 5148a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { .valid = 1 }, 5158a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_INIT] = { 5168a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 5178a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 5188a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_PKEY_INDEX | 5198a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PORT | 5208a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 5218a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_PKEY_INDEX | 5228a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PORT | 5238a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS), 5248a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_PKEY_INDEX | 5258a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PORT | 5268a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS), 527b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_INI] = (IB_QP_PKEY_INDEX | 528b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PORT | 529b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS), 530b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_TGT] = (IB_QP_PKEY_INDEX | 531b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PORT | 532b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS), 5338a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_PKEY_INDEX | 5348a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 5358a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_PKEY_INDEX | 5368a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 5378a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 5388a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 5398a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTR] = { 5408a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 5418a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .req_param = { 5428a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_AV | 5438a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MTU | 5448a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_DEST_QPN | 5458a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_RQ_PSN), 5468a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_AV | 5478a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MTU | 5488a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_DEST_QPN | 5498a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_RQ_PSN | 5508a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MAX_DEST_RD_ATOMIC | 5518a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MIN_RNR_TIMER), 552b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_INI] = (IB_QP_AV | 553b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PATH_MTU | 554b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_DEST_QPN | 555b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_RQ_PSN), 556b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_TGT] = (IB_QP_AV | 557b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PATH_MTU | 558b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_DEST_QPN | 559b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_RQ_PSN | 560b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_MAX_DEST_RD_ATOMIC | 561b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_MIN_RNR_TIMER), 5628a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 5638a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 5648a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_PKEY_INDEX | 5658a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 5668a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_ALT_PATH | 5678a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 5688a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PKEY_INDEX), 5698a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_ALT_PATH | 5708a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 5718a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PKEY_INDEX), 572b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_INI] = (IB_QP_ALT_PATH | 573b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS | 574b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PKEY_INDEX), 575b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_TGT] = (IB_QP_ALT_PATH | 576b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS | 577b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PKEY_INDEX), 5788a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_PKEY_INDEX | 5798a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 5808a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_PKEY_INDEX | 5818a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 5828a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 5838a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 5848a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 5858a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTR] = { 5868a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 5878a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { .valid = 1 }, 5888a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTS] = { 5898a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 5908a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .req_param = { 5918a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = IB_QP_SQ_PSN, 5928a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = IB_QP_SQ_PSN, 5938a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_TIMEOUT | 5948a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_RETRY_CNT | 5958a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_RNR_RETRY | 5968a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_SQ_PSN | 5978a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MAX_QP_RD_ATOMIC), 598b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_INI] = (IB_QP_TIMEOUT | 599b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_RETRY_CNT | 600b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_RNR_RETRY | 601b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_SQ_PSN | 602b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_MAX_QP_RD_ATOMIC), 603b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_TGT] = (IB_QP_TIMEOUT | 604b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_SQ_PSN), 6058a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = IB_QP_SQ_PSN, 6068a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = IB_QP_SQ_PSN, 6078a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 6088a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 6098a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_CUR_STATE | 6108a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 6118a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_CUR_STATE | 6128a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 6138a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 6148a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 6158a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_CUR_STATE | 6168a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 6178a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 6188a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MIN_RNR_TIMER | 6198a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 620b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_INI] = (IB_QP_CUR_STATE | 621b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ALT_PATH | 622b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS | 623b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PATH_MIG_STATE), 624b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_TGT] = (IB_QP_CUR_STATE | 625b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ALT_PATH | 626b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS | 627b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_MIN_RNR_TIMER | 628b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PATH_MIG_STATE), 6298a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_CUR_STATE | 6308a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 6318a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_CUR_STATE | 6328a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 6338a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 6348a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 6358a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 6368a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTS] = { 6378a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 6388a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { .valid = 1 }, 6398a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTS] = { 6408a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 6418a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 6428a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_CUR_STATE | 6438a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 6444546d31d84beafe74c56651173ac4fe197c7de8bDotan Barak [IB_QPT_UC] = (IB_QP_CUR_STATE | 6454546d31d84beafe74c56651173ac4fe197c7de8bDotan Barak IB_QP_ACCESS_FLAGS | 6468a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 6478a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 6484546d31d84beafe74c56651173ac4fe197c7de8bDotan Barak [IB_QPT_RC] = (IB_QP_CUR_STATE | 6494546d31d84beafe74c56651173ac4fe197c7de8bDotan Barak IB_QP_ACCESS_FLAGS | 6508a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 6518a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE | 6528a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MIN_RNR_TIMER), 653b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_INI] = (IB_QP_CUR_STATE | 654b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS | 655b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ALT_PATH | 656b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PATH_MIG_STATE), 657b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_TGT] = (IB_QP_CUR_STATE | 658b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS | 659b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ALT_PATH | 660b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PATH_MIG_STATE | 661b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_MIN_RNR_TIMER), 6628a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_CUR_STATE | 6638a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 6648a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_CUR_STATE | 6658a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 6668a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 6678a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 6688a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_SQD] = { 6698a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 6708a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 6718a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = IB_QP_EN_SQD_ASYNC_NOTIFY, 6728a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = IB_QP_EN_SQD_ASYNC_NOTIFY, 6738a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = IB_QP_EN_SQD_ASYNC_NOTIFY, 674b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_INI] = IB_QP_EN_SQD_ASYNC_NOTIFY, 675b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_TGT] = IB_QP_EN_SQD_ASYNC_NOTIFY, /* ??? */ 6768a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = IB_QP_EN_SQD_ASYNC_NOTIFY, 6778a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = IB_QP_EN_SQD_ASYNC_NOTIFY 6788a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 6798a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 6808a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 6818a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_SQD] = { 6828a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 6838a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { .valid = 1 }, 6848a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTS] = { 6858a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 6868a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 6878a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_CUR_STATE | 6888a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 6898a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_CUR_STATE | 6908a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 6918a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 6928a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 6938a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_CUR_STATE | 6948a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 6958a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 6968a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MIN_RNR_TIMER | 6978a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 698b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_INI] = (IB_QP_CUR_STATE | 699b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ALT_PATH | 700b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS | 701b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PATH_MIG_STATE), 702b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_TGT] = (IB_QP_CUR_STATE | 703b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ALT_PATH | 704b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS | 705b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_MIN_RNR_TIMER | 706b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PATH_MIG_STATE), 7078a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_CUR_STATE | 7088a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 7098a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_CUR_STATE | 7108a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 7118a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 7128a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 7138a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_SQD] = { 7148a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 7158a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 7168a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_PKEY_INDEX | 7178a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 7188a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_AV | 7198a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 7208a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 7218a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PKEY_INDEX | 7228a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 7238a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_RC] = (IB_QP_PORT | 7248a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_AV | 7258a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_TIMEOUT | 7268a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_RETRY_CNT | 7278a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_RNR_RETRY | 7288a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MAX_QP_RD_ATOMIC | 7298a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MAX_DEST_RD_ATOMIC | 7308a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ALT_PATH | 7318a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS | 7328a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PKEY_INDEX | 7338a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_MIN_RNR_TIMER | 7348a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_PATH_MIG_STATE), 735b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_INI] = (IB_QP_PORT | 736b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_AV | 737b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_TIMEOUT | 738b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_RETRY_CNT | 739b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_RNR_RETRY | 740b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_MAX_QP_RD_ATOMIC | 741b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ALT_PATH | 742b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS | 743b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PKEY_INDEX | 744b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PATH_MIG_STATE), 745b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty [IB_QPT_XRC_TGT] = (IB_QP_PORT | 746b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_AV | 747b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_TIMEOUT | 748b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_MAX_DEST_RD_ATOMIC | 749b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ALT_PATH | 750b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_ACCESS_FLAGS | 751b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PKEY_INDEX | 752b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_MIN_RNR_TIMER | 753b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty IB_QP_PATH_MIG_STATE), 7548a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_PKEY_INDEX | 7558a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 7568a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_PKEY_INDEX | 7578a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 7588a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 7598a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 7608a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 7618a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_SQE] = { 7628a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 7638a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { .valid = 1 }, 7648a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RTS] = { 7658a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .valid = 1, 7668a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier .opt_param = { 7678a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UD] = (IB_QP_CUR_STATE | 7688a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 7698a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_UC] = (IB_QP_CUR_STATE | 7708a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_ACCESS_FLAGS), 7718a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_SMI] = (IB_QP_CUR_STATE | 7728a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 7738a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPT_GSI] = (IB_QP_CUR_STATE | 7748a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier IB_QP_QKEY), 7758a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 7768a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 7778a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier }, 7788a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { 7798a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_RESET] = { .valid = 1 }, 7808a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier [IB_QPS_ERR] = { .valid = 1 } 7818a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier } 7828a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier}; 7838a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 7848a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreierint ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state, 7858a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier enum ib_qp_type type, enum ib_qp_attr_mask mask) 7868a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier{ 7878a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier enum ib_qp_attr_mask req_param, opt_param; 7888a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 7898a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier if (cur_state < 0 || cur_state > IB_QPS_ERR || 7908a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier next_state < 0 || next_state > IB_QPS_ERR) 7918a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier return 0; 7928a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 7938a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier if (mask & IB_QP_CUR_STATE && 7948a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier cur_state != IB_QPS_RTR && cur_state != IB_QPS_RTS && 7958a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier cur_state != IB_QPS_SQD && cur_state != IB_QPS_SQE) 7968a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier return 0; 7978a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 7988a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier if (!qp_state_table[cur_state][next_state].valid) 7998a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier return 0; 8008a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 8018a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier req_param = qp_state_table[cur_state][next_state].req_param[type]; 8028a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier opt_param = qp_state_table[cur_state][next_state].opt_param[type]; 8038a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 8048a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier if ((mask & req_param) != req_param) 8058a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier return 0; 8068a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 8078a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier if (mask & ~(req_param | opt_param | IB_QP_STATE)) 8088a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier return 0; 8098a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 8108a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier return 1; 8118a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier} 8128a51866f08103ba04894ce0f65eef567ddc3ed40Roland DreierEXPORT_SYMBOL(ib_modify_qp_is_ok); 8138a51866f08103ba04894ce0f65eef567ddc3ed40Roland Dreier 8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_modify_qp(struct ib_qp *qp, 8151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_qp_attr *qp_attr, 8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int qp_attr_mask) 8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8180e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty return qp->device->modify_qp(qp->real_qp, qp_attr, qp_attr_mask, NULL); 8191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_modify_qp); 8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_query_qp(struct ib_qp *qp, 8231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_qp_attr *qp_attr, 8241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int qp_attr_mask, 8251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_qp_init_attr *qp_init_attr) 8261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return qp->device->query_qp ? 8280e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty qp->device->query_qp(qp->real_qp, qp_attr, qp_attr_mask, qp_init_attr) : 8291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds -ENOSYS; 8301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_query_qp); 8321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8330e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Heftyint ib_close_qp(struct ib_qp *qp) 8340e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty{ 8350e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty struct ib_qp *real_qp; 8360e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty unsigned long flags; 8370e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 8380e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty real_qp = qp->real_qp; 8390e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty if (real_qp == qp) 8400e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty return -EINVAL; 8410e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 8420e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty spin_lock_irqsave(&real_qp->device->event_handler_lock, flags); 8430e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty list_del(&qp->open_list); 8440e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty spin_unlock_irqrestore(&real_qp->device->event_handler_lock, flags); 8450e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 8460e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty atomic_dec(&real_qp->usecnt); 8470e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty kfree(qp); 8480e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 8490e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty return 0; 8500e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty} 8510e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean HeftyEXPORT_SYMBOL(ib_close_qp); 8520e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 8530e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Heftystatic int __ib_destroy_shared_qp(struct ib_qp *qp) 8540e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty{ 8550e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty struct ib_xrcd *xrcd; 8560e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty struct ib_qp *real_qp; 8570e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty int ret; 8580e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 8590e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty real_qp = qp->real_qp; 8600e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty xrcd = real_qp->xrcd; 8610e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 8620e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty mutex_lock(&xrcd->tgt_qp_mutex); 8630e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty ib_close_qp(qp); 8640e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty if (atomic_read(&real_qp->usecnt) == 0) 8650e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty list_del(&real_qp->xrcd_list); 8660e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty else 8670e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty real_qp = NULL; 8680e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty mutex_unlock(&xrcd->tgt_qp_mutex); 8690e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 8700e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty if (real_qp) { 8710e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty ret = ib_destroy_qp(real_qp); 8720e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty if (!ret) 8730e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty atomic_dec(&xrcd->usecnt); 8740e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty else 8750e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty __ib_insert_xrcd_qp(xrcd, real_qp); 8760e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty } 8770e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 8780e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty return 0; 8790e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty} 8800e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 8811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_destroy_qp(struct ib_qp *qp) 8821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd; 8841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_cq *scq, *rcq; 8851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_srq *srq; 8861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 8871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8880e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty if (atomic_read(&qp->usecnt)) 8890e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty return -EBUSY; 8900e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 8910e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty if (qp->real_qp != qp) 8920e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty return __ib_destroy_shared_qp(qp); 8930e0ec7e0638ef48e0c661873dfcc8caccab984c6Sean Hefty 894b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty pd = qp->pd; 895b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty scq = qp->send_cq; 896b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty rcq = qp->recv_cq; 897b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty srq = qp->srq; 8981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = qp->device->destroy_qp(qp); 9001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!ret) { 901b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty if (pd) 902b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty atomic_dec(&pd->usecnt); 903b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty if (scq) 904b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty atomic_dec(&scq->usecnt); 905b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty if (rcq) 906b42b63cf0dde2af6eec462b2d6cca7d938702a28Sean Hefty atomic_dec(&rcq->usecnt); 9071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (srq) 9081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&srq->usecnt); 9091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 9121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 9131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_destroy_qp); 9141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Completion queues */ 9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_cq *ib_create_cq(struct ib_device *device, 9181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ib_comp_handler comp_handler, 9191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void (*event_handler)(struct ib_event *, void *), 920f4fd0b224d60044d2da5ca02f8f2b5150c1d8731Michael S. Tsirkin void *cq_context, int cqe, int comp_vector) 9211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 9221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_cq *cq; 9231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 924f4fd0b224d60044d2da5ca02f8f2b5150c1d8731Michael S. Tsirkin cq = device->create_cq(device, cqe, comp_vector, NULL, NULL); 9251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(cq)) { 9271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cq->device = device; 928b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier cq->uobject = NULL; 9291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cq->comp_handler = comp_handler; 9301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cq->event_handler = event_handler; 9311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cq->cq_context = cq_context; 9321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_set(&cq->usecnt, 0); 9331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return cq; 9361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 9371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_create_cq); 9381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9392dd5716227878d5950988514a2cbabf72f7fc888Eli Cohenint ib_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period) 9402dd5716227878d5950988514a2cbabf72f7fc888Eli Cohen{ 9412dd5716227878d5950988514a2cbabf72f7fc888Eli Cohen return cq->device->modify_cq ? 9422dd5716227878d5950988514a2cbabf72f7fc888Eli Cohen cq->device->modify_cq(cq, cq_count, cq_period) : -ENOSYS; 9432dd5716227878d5950988514a2cbabf72f7fc888Eli Cohen} 9442dd5716227878d5950988514a2cbabf72f7fc888Eli CohenEXPORT_SYMBOL(ib_modify_cq); 9452dd5716227878d5950988514a2cbabf72f7fc888Eli Cohen 9461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_destroy_cq(struct ib_cq *cq) 9471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 9481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (atomic_read(&cq->usecnt)) 9491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EBUSY; 9501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return cq->device->destroy_cq(cq); 9521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 9531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_destroy_cq); 9541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 955a74cd4af0bfa9578594acbb711a958104c93b772Roland Dreierint ib_resize_cq(struct ib_cq *cq, int cqe) 9561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 95740de2e548c225e3ef859e3c60de9785e37e1b5b1Roland Dreier return cq->device->resize_cq ? 95833b9b3ee9709b19c4f02ab91571d53540d05c3d1Roland Dreier cq->device->resize_cq(cq, cqe, NULL) : -ENOSYS; 9591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 9601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_resize_cq); 9611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Memory regions */ 9631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_mr *ib_get_dma_mr(struct ib_pd *pd, int mr_access_flags) 9651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 9661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_mr *mr; 9671c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen int err; 9681c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen 9691c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen err = ib_check_mr_access(mr_access_flags); 9701c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen if (err) 9711c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen return ERR_PTR(err); 9721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mr = pd->device->get_dma_mr(pd, mr_access_flags); 9741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(mr)) { 976b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mr->device = pd->device; 977b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mr->pd = pd; 978b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mr->uobject = NULL; 9791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&pd->usecnt); 9801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_set(&mr->usecnt, 0); 9811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return mr; 9841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 9851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_get_dma_mr); 9861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_mr *ib_reg_phys_mr(struct ib_pd *pd, 9881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_phys_buf *phys_buf_array, 9891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int num_phys_buf, 9901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int mr_access_flags, 9911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 *iova_start) 9921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 9931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_mr *mr; 9941c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen int err; 9951c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen 9961c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen err = ib_check_mr_access(mr_access_flags); 9971c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen if (err) 9981c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen return ERR_PTR(err); 9991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10007ce5eacb45a7c819a6bec6ed486f27db9aab6ab6Dotan Barak if (!pd->device->reg_phys_mr) 10017ce5eacb45a7c819a6bec6ed486f27db9aab6ab6Dotan Barak return ERR_PTR(-ENOSYS); 10027ce5eacb45a7c819a6bec6ed486f27db9aab6ab6Dotan Barak 10031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mr = pd->device->reg_phys_mr(pd, phys_buf_array, num_phys_buf, 10041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mr_access_flags, iova_start); 10051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(mr)) { 1007b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mr->device = pd->device; 1008b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mr->pd = pd; 1009b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mr->uobject = NULL; 10101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&pd->usecnt); 10111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_set(&mr->usecnt, 0); 10121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return mr; 10151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_reg_phys_mr); 10171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_rereg_phys_mr(struct ib_mr *mr, 10191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int mr_rereg_mask, 10201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd, 10211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_phys_buf *phys_buf_array, 10221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int num_phys_buf, 10231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int mr_access_flags, 10241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u64 *iova_start) 10251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 10261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *old_pd; 10271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 10281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10291c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen ret = ib_check_mr_access(mr_access_flags); 10301c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen if (ret) 10311c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen return ret; 10321c636f801615bdfc9b1d46904e8258c7a025670bEli Cohen 10331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!mr->device->rereg_phys_mr) 10341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOSYS; 10351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (atomic_read(&mr->usecnt)) 10371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EBUSY; 10381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds old_pd = mr->pd; 10401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = mr->device->rereg_phys_mr(mr, mr_rereg_mask, pd, 10421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds phys_buf_array, num_phys_buf, 10431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mr_access_flags, iova_start); 10441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!ret && (mr_rereg_mask & IB_MR_REREG_PD)) { 10461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&old_pd->usecnt); 10471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&pd->usecnt); 10481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 10511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_rereg_phys_mr); 10531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_query_mr(struct ib_mr *mr, struct ib_mr_attr *mr_attr) 10551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 10561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return mr->device->query_mr ? 10571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mr->device->query_mr(mr, mr_attr) : -ENOSYS; 10581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_query_mr); 10601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_dereg_mr(struct ib_mr *mr) 10621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 10631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd; 10641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 10651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (atomic_read(&mr->usecnt)) 10671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EBUSY; 10681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pd = mr->pd; 10701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = mr->device->dereg_mr(mr); 10711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!ret) 10721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&pd->usecnt); 10731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 10751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_dereg_mr); 10771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 107800f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wisestruct ib_mr *ib_alloc_fast_reg_mr(struct ib_pd *pd, int max_page_list_len) 107900f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise{ 108000f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise struct ib_mr *mr; 108100f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise 108200f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise if (!pd->device->alloc_fast_reg_mr) 108300f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise return ERR_PTR(-ENOSYS); 108400f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise 108500f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise mr = pd->device->alloc_fast_reg_mr(pd, max_page_list_len); 108600f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise 108700f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise if (!IS_ERR(mr)) { 108800f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise mr->device = pd->device; 108900f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise mr->pd = pd; 109000f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise mr->uobject = NULL; 109100f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise atomic_inc(&pd->usecnt); 109200f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise atomic_set(&mr->usecnt, 0); 109300f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise } 109400f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise 109500f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise return mr; 109600f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise} 109700f7ec36c9324928e4cd23f02e6d8550f30c32caSteve WiseEXPORT_SYMBOL(ib_alloc_fast_reg_mr); 109800f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise 109900f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wisestruct ib_fast_reg_page_list *ib_alloc_fast_reg_page_list(struct ib_device *device, 110000f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise int max_page_list_len) 110100f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise{ 110200f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise struct ib_fast_reg_page_list *page_list; 110300f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise 110400f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise if (!device->alloc_fast_reg_page_list) 110500f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise return ERR_PTR(-ENOSYS); 110600f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise 110700f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise page_list = device->alloc_fast_reg_page_list(device, max_page_list_len); 110800f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise 110900f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise if (!IS_ERR(page_list)) { 111000f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise page_list->device = device; 111100f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise page_list->max_page_list_len = max_page_list_len; 111200f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise } 111300f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise 111400f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise return page_list; 111500f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise} 111600f7ec36c9324928e4cd23f02e6d8550f30c32caSteve WiseEXPORT_SYMBOL(ib_alloc_fast_reg_page_list); 111700f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise 111800f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wisevoid ib_free_fast_reg_page_list(struct ib_fast_reg_page_list *page_list) 111900f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise{ 112000f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise page_list->device->free_fast_reg_page_list(page_list); 112100f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise} 112200f7ec36c9324928e4cd23f02e6d8550f30c32caSteve WiseEXPORT_SYMBOL(ib_free_fast_reg_page_list); 112300f7ec36c9324928e4cd23f02e6d8550f30c32caSteve Wise 11241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Memory windows */ 11251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11267083e42ee2ff43a11481e0e7211ec4f9ac68cb79Shani Michaelistruct ib_mw *ib_alloc_mw(struct ib_pd *pd, enum ib_mw_type type) 11271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_mw *mw; 11291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!pd->device->alloc_mw) 11311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ERR_PTR(-ENOSYS); 11321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11337083e42ee2ff43a11481e0e7211ec4f9ac68cb79Shani Michaeli mw = pd->device->alloc_mw(pd, type); 11341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(mw)) { 1135b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mw->device = pd->device; 1136b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mw->pd = pd; 1137b5e81bf5e7084796d93167f438ec073e59aca9edRoland Dreier mw->uobject = NULL; 11387083e42ee2ff43a11481e0e7211ec4f9ac68cb79Shani Michaeli mw->type = type; 11391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&pd->usecnt); 11401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 11411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return mw; 11431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 11441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_alloc_mw); 11451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_dealloc_mw(struct ib_mw *mw) 11471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd; 11491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 11501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pd = mw->pd; 11521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = mw->device->dealloc_mw(mw); 11531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!ret) 11541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&pd->usecnt); 11551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 11571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 11581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_dealloc_mw); 11591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* "Fast" memory regions */ 11611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ib_fmr *ib_alloc_fmr(struct ib_pd *pd, 11631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int mr_access_flags, 11641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_fmr_attr *fmr_attr) 11651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_fmr *fmr; 11671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!pd->device->alloc_fmr) 11691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ERR_PTR(-ENOSYS); 11701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmr = pd->device->alloc_fmr(pd, mr_access_flags, fmr_attr); 11721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!IS_ERR(fmr)) { 11731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmr->device = pd->device; 11741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmr->pd = pd; 11751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_inc(&pd->usecnt); 11761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 11771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return fmr; 11791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 11801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_alloc_fmr); 11811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_unmap_fmr(struct list_head *fmr_list) 11831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_fmr *fmr; 11851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (list_empty(fmr_list)) 11871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 11881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fmr = list_entry(fmr_list->next, struct ib_fmr, list); 11901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return fmr->device->unmap_fmr(fmr_list); 11911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 11921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_unmap_fmr); 11931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_dealloc_fmr(struct ib_fmr *fmr) 11951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct ib_pd *pd; 11971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 11981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pd = fmr->pd; 12001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = fmr->device->dealloc_fmr(fmr); 12011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!ret) 12021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_dec(&pd->usecnt); 12031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 12051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 12061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_dealloc_fmr); 12071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Multicast groups */ 12091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_attach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid) 12111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1212c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1Or Gerlitz int ret; 1213c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1Or Gerlitz 12140c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein if (!qp->device->attach_mcast) 12150c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein return -ENOSYS; 12160c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD) 12170c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein return -EINVAL; 12180c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein 1219c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1Or Gerlitz ret = qp->device->attach_mcast(qp, gid, lid); 1220c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1Or Gerlitz if (!ret) 1221c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1Or Gerlitz atomic_inc(&qp->usecnt); 1222c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1Or Gerlitz return ret; 12231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 12241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_attach_mcast); 12251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint ib_detach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid) 12271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1228c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1Or Gerlitz int ret; 1229c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1Or Gerlitz 12300c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein if (!qp->device->detach_mcast) 12310c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein return -ENOSYS; 12320c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD) 12330c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein return -EINVAL; 12340c33aeedb2cf99d877ad9adc7c3df07870f60293Jack Morgenstein 1235c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1Or Gerlitz ret = qp->device->detach_mcast(qp, gid, lid); 1236c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1Or Gerlitz if (!ret) 1237c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1Or Gerlitz atomic_dec(&qp->usecnt); 1238c3bccbfbb71f5e8a77129c7a069f5c5648cc9cf1Or Gerlitz return ret; 12391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 12401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ib_detach_mcast); 124159991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty 124259991f94eb32e954aa767f659eb642461e9e8b37Sean Heftystruct ib_xrcd *ib_alloc_xrcd(struct ib_device *device) 124359991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty{ 124459991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty struct ib_xrcd *xrcd; 124559991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty 124659991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty if (!device->alloc_xrcd) 124759991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty return ERR_PTR(-ENOSYS); 124859991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty 124959991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty xrcd = device->alloc_xrcd(device, NULL, NULL); 125059991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty if (!IS_ERR(xrcd)) { 125159991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty xrcd->device = device; 125253d0bd1e7ff2fc626321f337c609fb76ae5d12c9Sean Hefty xrcd->inode = NULL; 125359991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty atomic_set(&xrcd->usecnt, 0); 1254d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty mutex_init(&xrcd->tgt_qp_mutex); 1255d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty INIT_LIST_HEAD(&xrcd->tgt_qp_list); 125659991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty } 125759991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty 125859991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty return xrcd; 125959991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty} 126059991f94eb32e954aa767f659eb642461e9e8b37Sean HeftyEXPORT_SYMBOL(ib_alloc_xrcd); 126159991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty 126259991f94eb32e954aa767f659eb642461e9e8b37Sean Heftyint ib_dealloc_xrcd(struct ib_xrcd *xrcd) 126359991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty{ 1264d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty struct ib_qp *qp; 1265d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty int ret; 1266d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty 126759991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty if (atomic_read(&xrcd->usecnt)) 126859991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty return -EBUSY; 126959991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty 1270d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty while (!list_empty(&xrcd->tgt_qp_list)) { 1271d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty qp = list_entry(xrcd->tgt_qp_list.next, struct ib_qp, xrcd_list); 1272d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty ret = ib_destroy_qp(qp); 1273d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty if (ret) 1274d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty return ret; 1275d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty } 1276d3d72d909e783d048ee39046aa7b4fa798a4dda8Sean Hefty 127759991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty return xrcd->device->dealloc_xrcd(xrcd); 127859991f94eb32e954aa767f659eb642461e9e8b37Sean Hefty} 127959991f94eb32e954aa767f659eb642461e9e8b37Sean HeftyEXPORT_SYMBOL(ib_dealloc_xrcd); 1280319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion 1281319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zionstruct ib_flow *ib_create_flow(struct ib_qp *qp, 1282319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion struct ib_flow_attr *flow_attr, 1283319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion int domain) 1284319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion{ 1285319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion struct ib_flow *flow_id; 1286319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion if (!qp->device->create_flow) 1287319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion return ERR_PTR(-ENOSYS); 1288319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion 1289319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion flow_id = qp->device->create_flow(qp, flow_attr, domain); 1290319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion if (!IS_ERR(flow_id)) 1291319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion atomic_inc(&qp->usecnt); 1292319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion return flow_id; 1293319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion} 1294319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen ZionEXPORT_SYMBOL(ib_create_flow); 1295319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion 1296319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zionint ib_destroy_flow(struct ib_flow *flow_id) 1297319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion{ 1298319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion int err; 1299319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion struct ib_qp *qp = flow_id->qp; 1300319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion 1301319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion err = qp->device->destroy_flow(flow_id); 1302319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion if (!err) 1303319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion atomic_dec(&qp->usecnt); 1304319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion return err; 1305319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen Zion} 1306319a441d1361ea703b091caf92418f8121eadfc5Hadar Hen ZionEXPORT_SYMBOL(ib_destroy_flow); 1307