2 * Copyright (c) 2018-2019 Cavium, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
30 * Author: David C Somayajulu
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
40 #include "ecore_gtt_reg_addr.h"
42 #include "ecore_chain.h"
43 #include "ecore_status.h"
45 #include "ecore_rt_defs.h"
46 #include "ecore_init_ops.h"
47 #include "ecore_int.h"
48 #include "ecore_cxt.h"
49 #include "ecore_spq.h"
50 #include "ecore_init_fw_funcs.h"
51 #include "ecore_sp_commands.h"
52 #include "ecore_dev_api.h"
53 #include "ecore_l2_api.h"
54 #ifdef CONFIG_ECORE_SRIOV
55 #include "ecore_sriov.h"
58 #ifdef CONFIG_ECORE_LL2
59 #include "ecore_ll2.h"
61 #ifdef CONFIG_ECORE_FCOE
62 #include "ecore_fcoe.h"
64 #ifdef CONFIG_ECORE_ISCSI
65 #include "ecore_iscsi.h"
67 #include "ecore_mcp.h"
68 #include "ecore_hw_defs.h"
69 #include "mcp_public.h"
71 #ifdef CONFIG_ECORE_RDMA
72 #include "ecore_rdma.h"
75 #ifdef CONFIG_ECORE_ROCE
76 #include "ecore_roce.h"
79 #ifdef CONFIG_ECORE_IWARP
80 #include "ecore_iwarp.h"
83 #include "ecore_iro.h"
85 #include "ecore_dev_api.h"
86 #include "ecore_dbg_fw_funcs.h"
88 #include "qlnx_ioctl.h"
90 #include "qlnx_rdma.h"
94 struct mtx qlnx_rdma_dev_lock;
95 struct qlnx_rdma_if *qlnx_rdma_if = NULL;
97 qlnx_host_t *qlnx_host_list = NULL;
102 if (!mtx_initialized(&qlnx_rdma_dev_lock)) {
103 mtx_init(&qlnx_rdma_dev_lock, "qlnx_rdma_dev_lock", NULL, MTX_DEF);
109 qlnx_rdma_deinit(void)
111 if (mtx_initialized(&qlnx_rdma_dev_lock) && (qlnx_host_list == NULL)) {
112 mtx_destroy(&qlnx_rdma_dev_lock);
118 _qlnx_rdma_dev_add(struct qlnx_host *ha)
120 QL_DPRINT12(ha, "enter ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
122 if (qlnx_rdma_if == NULL)
125 if (ha->personality != ECORE_PCI_ETH_IWARP &&
126 ha->personality != ECORE_PCI_ETH_ROCE)
129 ha->qlnx_rdma = qlnx_rdma_if->add(ha);
131 QL_DPRINT12(ha, "exit (ha = %p, qlnx_rdma = %p)\n", ha, ha->qlnx_rdma);
136 qlnx_rdma_dev_add(struct qlnx_host *ha)
138 QL_DPRINT12(ha, "enter ha = %p\n", ha);
140 if (ha->personality != ECORE_PCI_ETH_IWARP &&
141 ha->personality != ECORE_PCI_ETH_ROCE)
144 mtx_lock(&qlnx_rdma_dev_lock);
146 if (qlnx_host_list == NULL) {
150 ha->next = qlnx_host_list;
154 mtx_unlock(&qlnx_rdma_dev_lock);
156 _qlnx_rdma_dev_add(ha);
158 QL_DPRINT12(ha, "exit (%p)\n", ha);
164 _qlnx_rdma_dev_remove(struct qlnx_host *ha)
168 QL_DPRINT12(ha, "enter ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
170 if (qlnx_rdma_if == NULL)
173 if (ha->personality != ECORE_PCI_ETH_IWARP &&
174 ha->personality != ECORE_PCI_ETH_ROCE)
177 ret = qlnx_rdma_if->remove(ha, ha->qlnx_rdma);
179 QL_DPRINT12(ha, "exit ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
184 qlnx_rdma_dev_remove(struct qlnx_host *ha)
187 qlnx_host_t *ha_prev;
190 QL_DPRINT12(ha, "enter ha = %p\n", ha);
192 if ((qlnx_host_list == NULL) || (ha == NULL))
195 if (ha->personality != ECORE_PCI_ETH_IWARP &&
196 ha->personality != ECORE_PCI_ETH_ROCE)
199 ret = _qlnx_rdma_dev_remove(ha);
204 mtx_lock(&qlnx_rdma_dev_lock);
206 if (qlnx_host_list == ha) {
207 qlnx_host_list = ha->next;
209 mtx_unlock(&qlnx_rdma_dev_lock);
210 QL_DPRINT12(ha, "exit0 ha = %p\n", ha);
214 ha_prev = ha_cur = qlnx_host_list;
216 while ((ha_cur != ha) && (ha_cur != NULL)) {
218 ha_cur = ha_cur->next;
226 mtx_unlock(&qlnx_rdma_dev_lock);
228 QL_DPRINT12(ha, "exit1 ha = %p\n", ha);
233 qlnx_rdma_register_if(qlnx_rdma_if_t *rdma_if)
237 if (mtx_initialized(&qlnx_rdma_dev_lock)) {
239 mtx_lock(&qlnx_rdma_dev_lock);
240 qlnx_rdma_if = rdma_if;
245 _qlnx_rdma_dev_add(ha);
249 mtx_unlock(&qlnx_rdma_dev_lock);
258 qlnx_rdma_deregister_if(qlnx_rdma_if_t *rdma_if)
263 printf("%s: enter rdma_if = %p\n", __func__, rdma_if);
265 if (mtx_initialized(&qlnx_rdma_dev_lock)) {
267 mtx_lock(&qlnx_rdma_dev_lock);
273 mtx_unlock(&qlnx_rdma_dev_lock);
275 if (ha->dbg_level & 0xF000)
278 ret = _qlnx_rdma_dev_remove(ha);
280 device_printf(ha->pci_dev, "%s [%d]: ret = 0x%x\n",
281 __func__, __LINE__, ret);
285 mtx_lock(&qlnx_rdma_dev_lock);
287 ha->qlnx_rdma = NULL;
295 mtx_unlock(&qlnx_rdma_dev_lock);
298 printf("%s: exit rdma_if = %p\n", __func__, rdma_if);
305 qlnx_rdma_dev_open(struct qlnx_host *ha)
307 QL_DPRINT12(ha, "enter ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
309 if (qlnx_rdma_if == NULL)
312 if (ha->personality != ECORE_PCI_ETH_IWARP &&
313 ha->personality != ECORE_PCI_ETH_ROCE)
316 qlnx_rdma_if->notify(ha, ha->qlnx_rdma, QLNX_ETHDEV_UP);
318 QL_DPRINT12(ha, "exit ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
324 qlnx_rdma_dev_close(struct qlnx_host *ha)
326 QL_DPRINT12(ha, "enter ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
328 if (qlnx_rdma_if == NULL)
331 if (ha->personality != ECORE_PCI_ETH_IWARP &&
332 ha->personality != ECORE_PCI_ETH_ROCE)
335 qlnx_rdma_if->notify(ha, ha->qlnx_rdma, QLNX_ETHDEV_DOWN);
337 QL_DPRINT12(ha, "exit ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
342 qlnx_rdma_get_num_irqs(struct qlnx_host *ha)
344 return (QLNX_NUM_CNQ + ecore_rdma_get_sb_id(&ha->cdev.hwfns[0], 0) + 2);