Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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);