^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * Copyright(c) 2016 - 2018 Intel Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * This file is provided under a dual BSD/GPLv2 license. When using or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * redistributing this file, you may do so under either license.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * GPL LICENSE SUMMARY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * it under the terms of version 2 of the GNU General Public License as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * published by the Free Software Foundation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * This program is distributed in the hope that it will be useful, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * WITHOUT ANY WARRANTY; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * BSD LICENSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * Redistribution and use in source and binary forms, with or without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * modification, are permitted provided that the following conditions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * are met:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * - Redistributions of source code must retain the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * notice, this list of conditions and the following disclaimer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * - Redistributions in binary form must reproduce the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * notice, this list of conditions and the following disclaimer in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * the documentation and/or other materials provided with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * distribution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * - Neither the name of Intel Corporation nor the names of its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * contributors may be used to endorse or promote products derived
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * from this software without specific prior written permission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #include <linux/dma-mapping.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include "vt.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #include "cq.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #include "trace.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define RVT_UVERBS_ABI_VERSION 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) MODULE_LICENSE("Dual BSD/GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) MODULE_DESCRIPTION("RDMA Verbs Transport Library");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) static int rvt_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) int ret = rvt_driver_cq_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) pr_err("Error in driver CQ init.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) module_init(rvt_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) static void rvt_cleanup(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) rvt_cq_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) module_exit(rvt_cleanup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) * rvt_alloc_device - allocate rdi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) * @size: how big of a structure to allocate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * @nports: number of ports to allocate array slots for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) * Use IB core device alloc to allocate space for the rdi which is assumed to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) * inside of the ib_device. Any extra space that drivers require should be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) * included in size.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * We also allocate a port array based on the number of ports.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * Return: pointer to allocated rdi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) struct rvt_dev_info *rvt_alloc_device(size_t size, int nports)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) struct rvt_dev_info *rdi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) rdi = container_of(_ib_alloc_device(size), struct rvt_dev_info, ibdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) if (!rdi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) return rdi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) rdi->ports = kcalloc(nports, sizeof(*rdi->ports), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) if (!rdi->ports)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) ib_dealloc_device(&rdi->ibdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) return rdi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) EXPORT_SYMBOL(rvt_alloc_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) * rvt_dealloc_device - deallocate rdi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) * @rdi: structure to free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) * Free a structure allocated with rvt_alloc_device()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) void rvt_dealloc_device(struct rvt_dev_info *rdi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) kfree(rdi->ports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) ib_dealloc_device(&rdi->ibdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) EXPORT_SYMBOL(rvt_dealloc_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) static int rvt_query_device(struct ib_device *ibdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) struct ib_device_attr *props,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) struct ib_udata *uhw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) if (uhw->inlen || uhw->outlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) * Return rvt_dev_info.dparms.props contents
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) *props = rdi->dparms.props;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) static int rvt_modify_device(struct ib_device *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) int device_modify_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) struct ib_device_modify *device_modify)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) * There is currently no need to supply this based on qib and hfi1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) * Future drivers may need to implement this though.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) * rvt_query_port: Passes the query port call to the driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) * @ibdev: Verbs IB dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * @port_num: port number, 1 based from ib core
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) * @props: structure to hold returned properties
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * Return: 0 on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static int rvt_query_port(struct ib_device *ibdev, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) struct ib_port_attr *props)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) struct rvt_ibport *rvp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) int port_index = ibport_num_to_idx(ibdev, port_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) if (port_index < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) rvp = rdi->ports[port_index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /* props being zeroed by the caller, avoid zeroing it here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) props->sm_lid = rvp->sm_lid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) props->sm_sl = rvp->sm_sl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) props->port_cap_flags = rvp->port_cap_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) props->max_msg_sz = 0x80000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) props->pkey_tbl_len = rvt_get_npkeys(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) props->bad_pkey_cntr = rvp->pkey_violations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) props->qkey_viol_cntr = rvp->qkey_violations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) props->subnet_timeout = rvp->subnet_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) props->init_type_reply = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) /* Populate the remaining ib_port_attr elements */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) return rdi->driver_f.query_port_state(rdi, port_num, props);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) * rvt_modify_port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) * @ibdev: Verbs IB dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) * @port_num: Port number, 1 based from ib core
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) * @port_modify_mask: How to change the port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) * @props: Structure to fill in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) * Return: 0 on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) static int rvt_modify_port(struct ib_device *ibdev, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) int port_modify_mask, struct ib_port_modify *props)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) struct rvt_ibport *rvp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) int port_index = ibport_num_to_idx(ibdev, port_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) if (port_index < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) rvp = rdi->ports[port_index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) if (port_modify_mask & IB_PORT_OPA_MASK_CHG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) rvp->port_cap3_flags |= props->set_port_cap_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) rvp->port_cap3_flags &= ~props->clr_port_cap_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) rvp->port_cap_flags |= props->set_port_cap_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) rvp->port_cap_flags &= ~props->clr_port_cap_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) if (props->set_port_cap_mask || props->clr_port_cap_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) rdi->driver_f.cap_mask_chg(rdi, port_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) if (port_modify_mask & IB_PORT_SHUTDOWN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) ret = rdi->driver_f.shut_down_port(rdi, port_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) if (port_modify_mask & IB_PORT_RESET_QKEY_CNTR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) rvp->qkey_violations = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) * rvt_query_pkey - Return a pkey from the table at a given index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) * @ibdev: Verbs IB dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) * @port_num: Port number, 1 based from ib core
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) * @index: Index into pkey table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) * @pkey: returned pkey from the port pkey table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) * Return: 0 on failure pkey otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) static int rvt_query_pkey(struct ib_device *ibdev, u8 port_num, u16 index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) u16 *pkey)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) * Driver will be responsible for keeping rvt_dev_info.pkey_table up to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) * date. This function will just return that value. There is no need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) * lock, if a stale value is read and sent to the user so be it there is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) * no way to protect against that anyway.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) int port_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) port_index = ibport_num_to_idx(ibdev, port_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) if (port_index < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) if (index >= rvt_get_npkeys(rdi))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) *pkey = rvt_get_pkey(rdi, port_index, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) * rvt_query_gid - Return a gid from the table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) * @ibdev: Verbs IB dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) * @port_num: Port number, 1 based from ib core
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) * @guid_index: Index in table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) * @gid: Gid to return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) * Return: 0 on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) static int rvt_query_gid(struct ib_device *ibdev, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) int guid_index, union ib_gid *gid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) struct rvt_dev_info *rdi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) struct rvt_ibport *rvp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) int port_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) * Driver is responsible for updating the guid table. Which will be used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) * to craft the return value. This will work similar to how query_pkey()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) * is being done.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) port_index = ibport_num_to_idx(ibdev, port_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) if (port_index < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) rdi = ib_to_rvt(ibdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) rvp = rdi->ports[port_index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) gid->global.subnet_prefix = rvp->gid_prefix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) return rdi->driver_f.get_guid_be(rdi, rvp, guid_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) &gid->global.interface_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) * rvt_alloc_ucontext - Allocate a user context
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) * @uctx: Verbs context
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) * @udata: User data allocated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) static int rvt_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) * rvt_dealloc_ucontext - Free a user context
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) * @context - Free this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) static void rvt_dealloc_ucontext(struct ib_ucontext *context)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) static int rvt_get_port_immutable(struct ib_device *ibdev, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) struct ib_port_immutable *immutable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) struct rvt_dev_info *rdi = ib_to_rvt(ibdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) struct ib_port_attr attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) int err, port_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) port_index = ibport_num_to_idx(ibdev, port_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) if (port_index < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) immutable->core_cap_flags = rdi->dparms.core_cap_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) err = ib_query_port(ibdev, port_num, &attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) immutable->pkey_tbl_len = attr.pkey_tbl_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) immutable->gid_tbl_len = attr.gid_tbl_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) immutable->max_mad_size = rdi->dparms.max_mad_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) MISC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) QUERY_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) MODIFY_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) QUERY_PORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) MODIFY_PORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) QUERY_PKEY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) QUERY_GID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) ALLOC_UCONTEXT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) DEALLOC_UCONTEXT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) GET_PORT_IMMUTABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) CREATE_QP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) MODIFY_QP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) DESTROY_QP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) QUERY_QP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) POST_SEND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) POST_RECV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) POST_SRQ_RECV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) CREATE_AH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) DESTROY_AH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) MODIFY_AH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) QUERY_AH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) CREATE_SRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) MODIFY_SRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) DESTROY_SRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) QUERY_SRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) ATTACH_MCAST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) DETACH_MCAST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) GET_DMA_MR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) REG_USER_MR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) DEREG_MR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) ALLOC_MR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) MAP_MR_SG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) ALLOC_FMR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) MAP_PHYS_FMR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) UNMAP_FMR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) DEALLOC_FMR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) MMAP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) CREATE_CQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) DESTROY_CQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) POLL_CQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) REQ_NOTFIY_CQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) RESIZE_CQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) ALLOC_PD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) DEALLOC_PD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) _VERB_IDX_MAX /* Must always be last! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) static const struct ib_device_ops rvt_dev_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) .uverbs_abi_ver = RVT_UVERBS_ABI_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) .alloc_mr = rvt_alloc_mr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) .alloc_pd = rvt_alloc_pd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) .alloc_ucontext = rvt_alloc_ucontext,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) .attach_mcast = rvt_attach_mcast,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) .create_ah = rvt_create_ah,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) .create_cq = rvt_create_cq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) .create_qp = rvt_create_qp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) .create_srq = rvt_create_srq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) .dealloc_pd = rvt_dealloc_pd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) .dealloc_ucontext = rvt_dealloc_ucontext,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) .dereg_mr = rvt_dereg_mr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) .destroy_ah = rvt_destroy_ah,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) .destroy_cq = rvt_destroy_cq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) .destroy_qp = rvt_destroy_qp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) .destroy_srq = rvt_destroy_srq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) .detach_mcast = rvt_detach_mcast,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) .get_dma_mr = rvt_get_dma_mr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) .get_port_immutable = rvt_get_port_immutable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) .map_mr_sg = rvt_map_mr_sg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) .mmap = rvt_mmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) .modify_ah = rvt_modify_ah,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) .modify_device = rvt_modify_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) .modify_port = rvt_modify_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) .modify_qp = rvt_modify_qp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) .modify_srq = rvt_modify_srq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) .poll_cq = rvt_poll_cq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) .post_recv = rvt_post_recv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) .post_send = rvt_post_send,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) .post_srq_recv = rvt_post_srq_recv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) .query_ah = rvt_query_ah,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) .query_device = rvt_query_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) .query_gid = rvt_query_gid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) .query_pkey = rvt_query_pkey,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) .query_port = rvt_query_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) .query_qp = rvt_query_qp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) .query_srq = rvt_query_srq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) .reg_user_mr = rvt_reg_user_mr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) .req_notify_cq = rvt_req_notify_cq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) .resize_cq = rvt_resize_cq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) INIT_RDMA_OBJ_SIZE(ib_ah, rvt_ah, ibah),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) INIT_RDMA_OBJ_SIZE(ib_cq, rvt_cq, ibcq),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) INIT_RDMA_OBJ_SIZE(ib_pd, rvt_pd, ibpd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) INIT_RDMA_OBJ_SIZE(ib_srq, rvt_srq, ibsrq),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) INIT_RDMA_OBJ_SIZE(ib_ucontext, rvt_ucontext, ibucontext),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) static noinline int check_support(struct rvt_dev_info *rdi, int verb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) switch (verb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) case MISC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) * These functions are not part of verbs specifically but are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) * required for rdmavt to function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) if ((!rdi->ibdev.ops.init_port) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) (!rdi->driver_f.get_pci_dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) case MODIFY_DEVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) * rdmavt does not support modify device currently drivers must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) * provide.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) if (!rdi->ibdev.ops.modify_device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) case QUERY_PORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) if (!rdi->ibdev.ops.query_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) if (!rdi->driver_f.query_port_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) case MODIFY_PORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) if (!rdi->ibdev.ops.modify_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) if (!rdi->driver_f.cap_mask_chg ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) !rdi->driver_f.shut_down_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) case QUERY_GID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) if (!rdi->ibdev.ops.query_gid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) if (!rdi->driver_f.get_guid_be)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) case CREATE_QP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) if (!rdi->ibdev.ops.create_qp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) if (!rdi->driver_f.qp_priv_alloc ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) !rdi->driver_f.qp_priv_free ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) !rdi->driver_f.notify_qp_reset ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) !rdi->driver_f.flush_qp_waiters ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) !rdi->driver_f.stop_send_queue ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) !rdi->driver_f.quiesce_qp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) case MODIFY_QP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) if (!rdi->ibdev.ops.modify_qp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) if (!rdi->driver_f.notify_qp_reset ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) !rdi->driver_f.schedule_send ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) !rdi->driver_f.get_pmtu_from_attr ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) !rdi->driver_f.flush_qp_waiters ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) !rdi->driver_f.stop_send_queue ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) !rdi->driver_f.quiesce_qp ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) !rdi->driver_f.notify_error_qp ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) !rdi->driver_f.mtu_from_qp ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) !rdi->driver_f.mtu_to_path_mtu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) case DESTROY_QP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) if (!rdi->ibdev.ops.destroy_qp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) if (!rdi->driver_f.qp_priv_free ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) !rdi->driver_f.notify_qp_reset ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) !rdi->driver_f.flush_qp_waiters ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) !rdi->driver_f.stop_send_queue ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) !rdi->driver_f.quiesce_qp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) case POST_SEND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) if (!rdi->ibdev.ops.post_send)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) if (!rdi->driver_f.schedule_send ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) !rdi->driver_f.do_send ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) !rdi->post_parms)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) * rvt_register_device - register a driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) * @rdi: main dev structure for all of rdmavt operations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) * It is up to drivers to allocate the rdi and fill in the appropriate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) * information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) * Return: 0 on success otherwise an errno.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) int rvt_register_device(struct rvt_dev_info *rdi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) int ret = 0, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) if (!rdi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) * Check to ensure drivers have setup the required helpers for the verbs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) * they want rdmavt to handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) for (i = 0; i < _VERB_IDX_MAX; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) if (check_support(rdi, i)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) pr_err("Driver support req not met at %d\n", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) ib_set_device_ops(&rdi->ibdev, &rvt_dev_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) /* Once we get past here we can use rvt_pr macros and tracepoints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) trace_rvt_dbg(rdi, "Driver attempting registration");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) rvt_mmap_init(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) /* Queue Pairs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) ret = rvt_driver_qp_init(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) pr_err("Error in driver QP init.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) /* Address Handle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) spin_lock_init(&rdi->n_ahs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) rdi->n_ahs_allocated = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) /* Shared Receive Queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) rvt_driver_srq_init(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) /* Multicast */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) rvt_driver_mcast_init(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) /* Mem Region */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) ret = rvt_driver_mr_init(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) pr_err("Error in driver MR init.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) goto bail_no_mr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) /* Memory Working Set Size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) ret = rvt_wss_init(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) rvt_pr_err(rdi, "Error in WSS init.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) goto bail_mr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) /* Completion queues */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) spin_lock_init(&rdi->n_cqs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) /* Protection Domain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) spin_lock_init(&rdi->n_pds_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) rdi->n_pds_allocated = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) * There are some things which could be set by underlying drivers but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) * really should be up to rdmavt to set. For instance drivers can't know
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) * exactly which functions rdmavt supports, nor do they know the ABI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) * version, so we do all of this sort of stuff here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) rdi->ibdev.uverbs_cmd_mask =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) (1ull << IB_USER_VERBS_CMD_GET_CONTEXT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) (1ull << IB_USER_VERBS_CMD_QUERY_DEVICE) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) (1ull << IB_USER_VERBS_CMD_QUERY_PORT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) (1ull << IB_USER_VERBS_CMD_ALLOC_PD) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) (1ull << IB_USER_VERBS_CMD_DEALLOC_PD) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) (1ull << IB_USER_VERBS_CMD_CREATE_AH) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) (1ull << IB_USER_VERBS_CMD_MODIFY_AH) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) (1ull << IB_USER_VERBS_CMD_QUERY_AH) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) (1ull << IB_USER_VERBS_CMD_DESTROY_AH) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) (1ull << IB_USER_VERBS_CMD_REG_MR) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) (1ull << IB_USER_VERBS_CMD_DEREG_MR) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) (1ull << IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) (1ull << IB_USER_VERBS_CMD_CREATE_CQ) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) (1ull << IB_USER_VERBS_CMD_RESIZE_CQ) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) (1ull << IB_USER_VERBS_CMD_DESTROY_CQ) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) (1ull << IB_USER_VERBS_CMD_POLL_CQ) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) (1ull << IB_USER_VERBS_CMD_REQ_NOTIFY_CQ) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) (1ull << IB_USER_VERBS_CMD_CREATE_QP) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) (1ull << IB_USER_VERBS_CMD_QUERY_QP) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) (1ull << IB_USER_VERBS_CMD_MODIFY_QP) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) (1ull << IB_USER_VERBS_CMD_DESTROY_QP) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) (1ull << IB_USER_VERBS_CMD_POST_SEND) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) (1ull << IB_USER_VERBS_CMD_POST_RECV) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) (1ull << IB_USER_VERBS_CMD_ATTACH_MCAST) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) (1ull << IB_USER_VERBS_CMD_DETACH_MCAST) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) (1ull << IB_USER_VERBS_CMD_CREATE_SRQ) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) (1ull << IB_USER_VERBS_CMD_MODIFY_SRQ) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) (1ull << IB_USER_VERBS_CMD_QUERY_SRQ) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) (1ull << IB_USER_VERBS_CMD_POST_SRQ_RECV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) rdi->ibdev.node_type = RDMA_NODE_IB_CA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) if (!rdi->ibdev.num_comp_vectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) rdi->ibdev.num_comp_vectors = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) /* We are now good to announce we exist */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) ret = ib_register_device(&rdi->ibdev, dev_name(&rdi->ibdev.dev), NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) rvt_pr_err(rdi, "Failed to register driver with ib core.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) goto bail_wss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) rvt_create_mad_agents(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) rvt_pr_info(rdi, "Registration with rdmavt done.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) bail_wss:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) rvt_wss_exit(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) bail_mr:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) rvt_mr_exit(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) bail_no_mr:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) rvt_qp_exit(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) EXPORT_SYMBOL(rvt_register_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) * rvt_unregister_device - remove a driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) * @rdi: rvt dev struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) void rvt_unregister_device(struct rvt_dev_info *rdi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) trace_rvt_dbg(rdi, "Driver is unregistering.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) if (!rdi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) rvt_free_mad_agents(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) ib_unregister_device(&rdi->ibdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) rvt_wss_exit(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) rvt_mr_exit(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) rvt_qp_exit(rdi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) EXPORT_SYMBOL(rvt_unregister_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) * rvt_init_port - init internal data for driver port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) * @rdi: rvt_dev_info struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) * @port: rvt port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) * @port_index: 0 based index of ports, different from IB core port num
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) * @pkey_table: pkey_table for @port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) * Keep track of a list of ports. No need to have a detach port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) * They persist until the driver goes away.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) * Return: always 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) int rvt_init_port(struct rvt_dev_info *rdi, struct rvt_ibport *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) int port_index, u16 *pkey_table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) rdi->ports[port_index] = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) rdi->ports[port_index]->pkey_table = pkey_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) EXPORT_SYMBOL(rvt_init_port);