1fa790ea9SDavid C Somayajulu /*
2fa790ea9SDavid C Somayajulu * Copyright (c) 2018-2019 Cavium, Inc.
3fa790ea9SDavid C Somayajulu * All rights reserved.
4fa790ea9SDavid C Somayajulu *
5fa790ea9SDavid C Somayajulu * Redistribution and use in source and binary forms, with or without
6fa790ea9SDavid C Somayajulu * modification, are permitted provided that the following conditions
7fa790ea9SDavid C Somayajulu * are met:
8fa790ea9SDavid C Somayajulu *
9fa790ea9SDavid C Somayajulu * 1. Redistributions of source code must retain the above copyright
10fa790ea9SDavid C Somayajulu * notice, this list of conditions and the following disclaimer.
11fa790ea9SDavid C Somayajulu * 2. Redistributions in binary form must reproduce the above copyright
12fa790ea9SDavid C Somayajulu * notice, this list of conditions and the following disclaimer in the
13fa790ea9SDavid C Somayajulu * documentation and/or other materials provided with the distribution.
14fa790ea9SDavid C Somayajulu *
15fa790ea9SDavid C Somayajulu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16fa790ea9SDavid C Somayajulu * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17fa790ea9SDavid C Somayajulu * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18fa790ea9SDavid C Somayajulu * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19fa790ea9SDavid C Somayajulu * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20fa790ea9SDavid C Somayajulu * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21fa790ea9SDavid C Somayajulu * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22fa790ea9SDavid C Somayajulu * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23fa790ea9SDavid C Somayajulu * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24fa790ea9SDavid C Somayajulu * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25fa790ea9SDavid C Somayajulu * POSSIBILITY OF SUCH DAMAGE.
26fa790ea9SDavid C Somayajulu */
27fa790ea9SDavid C Somayajulu
28fa790ea9SDavid C Somayajulu /*
29fa790ea9SDavid C Somayajulu * File : qlnx_rdma.c
30fa790ea9SDavid C Somayajulu * Author: David C Somayajulu
31fa790ea9SDavid C Somayajulu */
32fa790ea9SDavid C Somayajulu #include <sys/cdefs.h>
33fa790ea9SDavid C Somayajulu #include "qlnx_os.h"
34fa790ea9SDavid C Somayajulu #include "bcm_osal.h"
35fa790ea9SDavid C Somayajulu
36fa790ea9SDavid C Somayajulu #include "reg_addr.h"
37fa790ea9SDavid C Somayajulu #include "ecore_gtt_reg_addr.h"
38fa790ea9SDavid C Somayajulu #include "ecore.h"
39fa790ea9SDavid C Somayajulu #include "ecore_chain.h"
40fa790ea9SDavid C Somayajulu #include "ecore_status.h"
41fa790ea9SDavid C Somayajulu #include "ecore_hw.h"
42fa790ea9SDavid C Somayajulu #include "ecore_rt_defs.h"
43fa790ea9SDavid C Somayajulu #include "ecore_init_ops.h"
44fa790ea9SDavid C Somayajulu #include "ecore_int.h"
45fa790ea9SDavid C Somayajulu #include "ecore_cxt.h"
46fa790ea9SDavid C Somayajulu #include "ecore_spq.h"
47fa790ea9SDavid C Somayajulu #include "ecore_init_fw_funcs.h"
48fa790ea9SDavid C Somayajulu #include "ecore_sp_commands.h"
49fa790ea9SDavid C Somayajulu #include "ecore_dev_api.h"
50fa790ea9SDavid C Somayajulu #include "ecore_l2_api.h"
51fa790ea9SDavid C Somayajulu #ifdef CONFIG_ECORE_SRIOV
52fa790ea9SDavid C Somayajulu #include "ecore_sriov.h"
53fa790ea9SDavid C Somayajulu #include "ecore_vf.h"
54fa790ea9SDavid C Somayajulu #endif
55fa790ea9SDavid C Somayajulu #ifdef CONFIG_ECORE_LL2
56fa790ea9SDavid C Somayajulu #include "ecore_ll2.h"
57fa790ea9SDavid C Somayajulu #endif
58fa790ea9SDavid C Somayajulu #ifdef CONFIG_ECORE_FCOE
59fa790ea9SDavid C Somayajulu #include "ecore_fcoe.h"
60fa790ea9SDavid C Somayajulu #endif
61fa790ea9SDavid C Somayajulu #ifdef CONFIG_ECORE_ISCSI
62fa790ea9SDavid C Somayajulu #include "ecore_iscsi.h"
63fa790ea9SDavid C Somayajulu #endif
64fa790ea9SDavid C Somayajulu #include "ecore_mcp.h"
65fa790ea9SDavid C Somayajulu #include "ecore_hw_defs.h"
66fa790ea9SDavid C Somayajulu #include "mcp_public.h"
67fa790ea9SDavid C Somayajulu
68fa790ea9SDavid C Somayajulu #ifdef CONFIG_ECORE_RDMA
69fa790ea9SDavid C Somayajulu #include "ecore_rdma.h"
70fa790ea9SDavid C Somayajulu #endif
71fa790ea9SDavid C Somayajulu
72fa790ea9SDavid C Somayajulu #ifdef CONFIG_ECORE_ROCE
73fa790ea9SDavid C Somayajulu #include "ecore_roce.h"
74fa790ea9SDavid C Somayajulu #endif
75fa790ea9SDavid C Somayajulu
76fa790ea9SDavid C Somayajulu #ifdef CONFIG_ECORE_IWARP
77fa790ea9SDavid C Somayajulu #include "ecore_iwarp.h"
78fa790ea9SDavid C Somayajulu #endif
79fa790ea9SDavid C Somayajulu
80fa790ea9SDavid C Somayajulu #include "ecore_iro.h"
81fa790ea9SDavid C Somayajulu #include "nvm_cfg.h"
82fa790ea9SDavid C Somayajulu #include "ecore_dev_api.h"
83fa790ea9SDavid C Somayajulu #include "ecore_dbg_fw_funcs.h"
84fa790ea9SDavid C Somayajulu
85fa790ea9SDavid C Somayajulu #include "qlnx_ioctl.h"
86fa790ea9SDavid C Somayajulu #include "qlnx_def.h"
87fa790ea9SDavid C Somayajulu #include "qlnx_rdma.h"
88fa790ea9SDavid C Somayajulu #include "qlnx_ver.h"
89fa790ea9SDavid C Somayajulu #include <sys/smp.h>
90fa790ea9SDavid C Somayajulu
91fa790ea9SDavid C Somayajulu struct mtx qlnx_rdma_dev_lock;
92fa790ea9SDavid C Somayajulu struct qlnx_rdma_if *qlnx_rdma_if = NULL;
93fa790ea9SDavid C Somayajulu
94fa790ea9SDavid C Somayajulu qlnx_host_t *qlnx_host_list = NULL;
95fa790ea9SDavid C Somayajulu
96fa790ea9SDavid C Somayajulu void
qlnx_rdma_init(void)97fa790ea9SDavid C Somayajulu qlnx_rdma_init(void)
98fa790ea9SDavid C Somayajulu {
99fa790ea9SDavid C Somayajulu if (!mtx_initialized(&qlnx_rdma_dev_lock)) {
100fa790ea9SDavid C Somayajulu mtx_init(&qlnx_rdma_dev_lock, "qlnx_rdma_dev_lock", NULL, MTX_DEF);
101fa790ea9SDavid C Somayajulu }
102fa790ea9SDavid C Somayajulu return;
103fa790ea9SDavid C Somayajulu }
104fa790ea9SDavid C Somayajulu
105fa790ea9SDavid C Somayajulu void
qlnx_rdma_deinit(void)106fa790ea9SDavid C Somayajulu qlnx_rdma_deinit(void)
107fa790ea9SDavid C Somayajulu {
108fa790ea9SDavid C Somayajulu if (mtx_initialized(&qlnx_rdma_dev_lock) && (qlnx_host_list == NULL)) {
109fa790ea9SDavid C Somayajulu mtx_destroy(&qlnx_rdma_dev_lock);
110fa790ea9SDavid C Somayajulu }
111fa790ea9SDavid C Somayajulu return;
112fa790ea9SDavid C Somayajulu }
113fa790ea9SDavid C Somayajulu
114fa790ea9SDavid C Somayajulu static void
_qlnx_rdma_dev_add(struct qlnx_host * ha)115fa790ea9SDavid C Somayajulu _qlnx_rdma_dev_add(struct qlnx_host *ha)
116fa790ea9SDavid C Somayajulu {
117fa790ea9SDavid C Somayajulu QL_DPRINT12(ha, "enter ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
118fa790ea9SDavid C Somayajulu
119fa790ea9SDavid C Somayajulu if (qlnx_rdma_if == NULL)
120fa790ea9SDavid C Somayajulu return;
121fa790ea9SDavid C Somayajulu
122fa790ea9SDavid C Somayajulu if (ha->personality != ECORE_PCI_ETH_IWARP &&
123fa790ea9SDavid C Somayajulu ha->personality != ECORE_PCI_ETH_ROCE)
124fa790ea9SDavid C Somayajulu return;
125fa790ea9SDavid C Somayajulu
126fa790ea9SDavid C Somayajulu ha->qlnx_rdma = qlnx_rdma_if->add(ha);
127fa790ea9SDavid C Somayajulu
128fa790ea9SDavid C Somayajulu QL_DPRINT12(ha, "exit (ha = %p, qlnx_rdma = %p)\n", ha, ha->qlnx_rdma);
129fa790ea9SDavid C Somayajulu return;
130fa790ea9SDavid C Somayajulu }
131fa790ea9SDavid C Somayajulu
132fa790ea9SDavid C Somayajulu void
qlnx_rdma_dev_add(struct qlnx_host * ha)133fa790ea9SDavid C Somayajulu qlnx_rdma_dev_add(struct qlnx_host *ha)
134fa790ea9SDavid C Somayajulu {
135fa790ea9SDavid C Somayajulu QL_DPRINT12(ha, "enter ha = %p\n", ha);
136fa790ea9SDavid C Somayajulu
137fa790ea9SDavid C Somayajulu if (ha->personality != ECORE_PCI_ETH_IWARP &&
138fa790ea9SDavid C Somayajulu ha->personality != ECORE_PCI_ETH_ROCE)
139fa790ea9SDavid C Somayajulu return;
140fa790ea9SDavid C Somayajulu
141fa790ea9SDavid C Somayajulu mtx_lock(&qlnx_rdma_dev_lock);
142fa790ea9SDavid C Somayajulu
143fa790ea9SDavid C Somayajulu if (qlnx_host_list == NULL) {
144fa790ea9SDavid C Somayajulu qlnx_host_list = ha;
145fa790ea9SDavid C Somayajulu ha->next = NULL;
146fa790ea9SDavid C Somayajulu } else {
147fa790ea9SDavid C Somayajulu ha->next = qlnx_host_list;
148fa790ea9SDavid C Somayajulu qlnx_host_list = ha;
149fa790ea9SDavid C Somayajulu }
150fa790ea9SDavid C Somayajulu
151fa790ea9SDavid C Somayajulu mtx_unlock(&qlnx_rdma_dev_lock);
152fa790ea9SDavid C Somayajulu
153fa790ea9SDavid C Somayajulu _qlnx_rdma_dev_add(ha);
154fa790ea9SDavid C Somayajulu
155fa790ea9SDavid C Somayajulu QL_DPRINT12(ha, "exit (%p)\n", ha);
156fa790ea9SDavid C Somayajulu
157fa790ea9SDavid C Somayajulu return;
158fa790ea9SDavid C Somayajulu }
159fa790ea9SDavid C Somayajulu
160fa790ea9SDavid C Somayajulu static int
_qlnx_rdma_dev_remove(struct qlnx_host * ha)161fa790ea9SDavid C Somayajulu _qlnx_rdma_dev_remove(struct qlnx_host *ha)
162fa790ea9SDavid C Somayajulu {
163fa790ea9SDavid C Somayajulu int ret = 0;
164fa790ea9SDavid C Somayajulu
165fa790ea9SDavid C Somayajulu QL_DPRINT12(ha, "enter ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
166fa790ea9SDavid C Somayajulu
167fa790ea9SDavid C Somayajulu if (qlnx_rdma_if == NULL)
168fa790ea9SDavid C Somayajulu return (ret);
169fa790ea9SDavid C Somayajulu
170fa790ea9SDavid C Somayajulu if (ha->personality != ECORE_PCI_ETH_IWARP &&
171fa790ea9SDavid C Somayajulu ha->personality != ECORE_PCI_ETH_ROCE)
172fa790ea9SDavid C Somayajulu return (ret);
173fa790ea9SDavid C Somayajulu
174fa790ea9SDavid C Somayajulu ret = qlnx_rdma_if->remove(ha, ha->qlnx_rdma);
175fa790ea9SDavid C Somayajulu
176fa790ea9SDavid C Somayajulu QL_DPRINT12(ha, "exit ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
177fa790ea9SDavid C Somayajulu return (ret);
178fa790ea9SDavid C Somayajulu }
179fa790ea9SDavid C Somayajulu
180fa790ea9SDavid C Somayajulu int
qlnx_rdma_dev_remove(struct qlnx_host * ha)181fa790ea9SDavid C Somayajulu qlnx_rdma_dev_remove(struct qlnx_host *ha)
182fa790ea9SDavid C Somayajulu {
183fa790ea9SDavid C Somayajulu int ret = 0;
184fa790ea9SDavid C Somayajulu qlnx_host_t *ha_cur;
185fa790ea9SDavid C Somayajulu
186fa790ea9SDavid C Somayajulu QL_DPRINT12(ha, "enter ha = %p\n", ha);
187fa790ea9SDavid C Somayajulu
188fa790ea9SDavid C Somayajulu if ((qlnx_host_list == NULL) || (ha == NULL))
189fa790ea9SDavid C Somayajulu return (ret);
190fa790ea9SDavid C Somayajulu
191fa790ea9SDavid C Somayajulu if (ha->personality != ECORE_PCI_ETH_IWARP &&
192fa790ea9SDavid C Somayajulu ha->personality != ECORE_PCI_ETH_ROCE)
193fa790ea9SDavid C Somayajulu return (ret);
194fa790ea9SDavid C Somayajulu
195fa790ea9SDavid C Somayajulu ret = _qlnx_rdma_dev_remove(ha);
196fa790ea9SDavid C Somayajulu
197fa790ea9SDavid C Somayajulu if (ret)
198fa790ea9SDavid C Somayajulu return (ret);
199fa790ea9SDavid C Somayajulu
200fa790ea9SDavid C Somayajulu mtx_lock(&qlnx_rdma_dev_lock);
201fa790ea9SDavid C Somayajulu
202fa790ea9SDavid C Somayajulu if (qlnx_host_list == ha) {
203fa790ea9SDavid C Somayajulu qlnx_host_list = ha->next;
204fa790ea9SDavid C Somayajulu ha->next = NULL;
205fa790ea9SDavid C Somayajulu mtx_unlock(&qlnx_rdma_dev_lock);
206fa790ea9SDavid C Somayajulu QL_DPRINT12(ha, "exit0 ha = %p\n", ha);
207fa790ea9SDavid C Somayajulu return (ret);
208fa790ea9SDavid C Somayajulu }
209fa790ea9SDavid C Somayajulu
21091aa93ebSJohn Baldwin ha_cur = qlnx_host_list;
211fa790ea9SDavid C Somayajulu
212fa790ea9SDavid C Somayajulu while ((ha_cur != ha) && (ha_cur != NULL)) {
213fa790ea9SDavid C Somayajulu ha_cur = ha_cur->next;
214fa790ea9SDavid C Somayajulu }
215fa790ea9SDavid C Somayajulu
216fa790ea9SDavid C Somayajulu if (ha_cur == ha) {
217fa790ea9SDavid C Somayajulu ha->next = NULL;
218fa790ea9SDavid C Somayajulu }
219fa790ea9SDavid C Somayajulu
220fa790ea9SDavid C Somayajulu mtx_unlock(&qlnx_rdma_dev_lock);
221fa790ea9SDavid C Somayajulu
222fa790ea9SDavid C Somayajulu QL_DPRINT12(ha, "exit1 ha = %p\n", ha);
223fa790ea9SDavid C Somayajulu return (ret);
224fa790ea9SDavid C Somayajulu }
225fa790ea9SDavid C Somayajulu
226fa790ea9SDavid C Somayajulu int
qlnx_rdma_register_if(qlnx_rdma_if_t * rdma_if)227fa790ea9SDavid C Somayajulu qlnx_rdma_register_if(qlnx_rdma_if_t *rdma_if)
228fa790ea9SDavid C Somayajulu {
229fa790ea9SDavid C Somayajulu qlnx_host_t *ha;
230fa790ea9SDavid C Somayajulu
231fa790ea9SDavid C Somayajulu if (mtx_initialized(&qlnx_rdma_dev_lock)) {
232fa790ea9SDavid C Somayajulu mtx_lock(&qlnx_rdma_dev_lock);
233fa790ea9SDavid C Somayajulu qlnx_rdma_if = rdma_if;
234fa790ea9SDavid C Somayajulu
235fa790ea9SDavid C Somayajulu ha = qlnx_host_list;
236fa790ea9SDavid C Somayajulu
237fa790ea9SDavid C Somayajulu while (ha != NULL) {
238fa790ea9SDavid C Somayajulu _qlnx_rdma_dev_add(ha);
239fa790ea9SDavid C Somayajulu ha = ha->next;
240fa790ea9SDavid C Somayajulu }
241fa790ea9SDavid C Somayajulu
242fa790ea9SDavid C Somayajulu mtx_unlock(&qlnx_rdma_dev_lock);
243fa790ea9SDavid C Somayajulu
244fa790ea9SDavid C Somayajulu return (0);
245fa790ea9SDavid C Somayajulu }
246fa790ea9SDavid C Somayajulu
247*ee07d712SJohn Baldwin return (ENXIO);
248fa790ea9SDavid C Somayajulu }
249fa790ea9SDavid C Somayajulu
250fa790ea9SDavid C Somayajulu int
qlnx_rdma_deregister_if(qlnx_rdma_if_t * rdma_if)251fa790ea9SDavid C Somayajulu qlnx_rdma_deregister_if(qlnx_rdma_if_t *rdma_if)
252fa790ea9SDavid C Somayajulu {
253fa790ea9SDavid C Somayajulu int ret = 0;
254fa790ea9SDavid C Somayajulu qlnx_host_t *ha;
255fa790ea9SDavid C Somayajulu
256fa790ea9SDavid C Somayajulu if (mtx_initialized(&qlnx_rdma_dev_lock)) {
257fa790ea9SDavid C Somayajulu mtx_lock(&qlnx_rdma_dev_lock);
258fa790ea9SDavid C Somayajulu
259fa790ea9SDavid C Somayajulu ha = qlnx_host_list;
260fa790ea9SDavid C Somayajulu
261fa790ea9SDavid C Somayajulu while (ha != NULL) {
262fa790ea9SDavid C Somayajulu mtx_unlock(&qlnx_rdma_dev_lock);
263fa790ea9SDavid C Somayajulu
264fa790ea9SDavid C Somayajulu if (ha->dbg_level & 0xF000)
265fa790ea9SDavid C Somayajulu ret = EBUSY;
266fa790ea9SDavid C Somayajulu else
267fa790ea9SDavid C Somayajulu ret = _qlnx_rdma_dev_remove(ha);
268fa790ea9SDavid C Somayajulu
269fa790ea9SDavid C Somayajulu device_printf(ha->pci_dev, "%s [%d]: ret = 0x%x\n",
270fa790ea9SDavid C Somayajulu __func__, __LINE__, ret);
271fa790ea9SDavid C Somayajulu if (ret)
272fa790ea9SDavid C Somayajulu return (ret);
273fa790ea9SDavid C Somayajulu
274fa790ea9SDavid C Somayajulu mtx_lock(&qlnx_rdma_dev_lock);
275fa790ea9SDavid C Somayajulu
276fa790ea9SDavid C Somayajulu ha->qlnx_rdma = NULL;
277fa790ea9SDavid C Somayajulu
278fa790ea9SDavid C Somayajulu ha = ha->next;
279fa790ea9SDavid C Somayajulu }
280fa790ea9SDavid C Somayajulu
281fa790ea9SDavid C Somayajulu if (!ret)
282fa790ea9SDavid C Somayajulu qlnx_rdma_if = NULL;
283fa790ea9SDavid C Somayajulu
284fa790ea9SDavid C Somayajulu mtx_unlock(&qlnx_rdma_dev_lock);
285fa790ea9SDavid C Somayajulu }
286fa790ea9SDavid C Somayajulu
287fa790ea9SDavid C Somayajulu return (ret);
288fa790ea9SDavid C Somayajulu }
289fa790ea9SDavid C Somayajulu
290fa790ea9SDavid C Somayajulu void
qlnx_rdma_dev_open(struct qlnx_host * ha)291fa790ea9SDavid C Somayajulu qlnx_rdma_dev_open(struct qlnx_host *ha)
292fa790ea9SDavid C Somayajulu {
293fa790ea9SDavid C Somayajulu QL_DPRINT12(ha, "enter ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
294fa790ea9SDavid C Somayajulu
295fa790ea9SDavid C Somayajulu if (qlnx_rdma_if == NULL)
296fa790ea9SDavid C Somayajulu return;
297fa790ea9SDavid C Somayajulu
298fa790ea9SDavid C Somayajulu if (ha->personality != ECORE_PCI_ETH_IWARP &&
299fa790ea9SDavid C Somayajulu ha->personality != ECORE_PCI_ETH_ROCE)
300fa790ea9SDavid C Somayajulu return;
301fa790ea9SDavid C Somayajulu
302fa790ea9SDavid C Somayajulu qlnx_rdma_if->notify(ha, ha->qlnx_rdma, QLNX_ETHDEV_UP);
303fa790ea9SDavid C Somayajulu
304fa790ea9SDavid C Somayajulu QL_DPRINT12(ha, "exit ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
305fa790ea9SDavid C Somayajulu return;
306fa790ea9SDavid C Somayajulu }
307fa790ea9SDavid C Somayajulu
308fa790ea9SDavid C Somayajulu void
qlnx_rdma_dev_close(struct qlnx_host * ha)309fa790ea9SDavid C Somayajulu qlnx_rdma_dev_close(struct qlnx_host *ha)
310fa790ea9SDavid C Somayajulu {
311fa790ea9SDavid C Somayajulu QL_DPRINT12(ha, "enter ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
312fa790ea9SDavid C Somayajulu
313fa790ea9SDavid C Somayajulu if (qlnx_rdma_if == NULL)
314fa790ea9SDavid C Somayajulu return;
315fa790ea9SDavid C Somayajulu
316fa790ea9SDavid C Somayajulu if (ha->personality != ECORE_PCI_ETH_IWARP &&
317fa790ea9SDavid C Somayajulu ha->personality != ECORE_PCI_ETH_ROCE)
318fa790ea9SDavid C Somayajulu return;
319fa790ea9SDavid C Somayajulu
320fa790ea9SDavid C Somayajulu qlnx_rdma_if->notify(ha, ha->qlnx_rdma, QLNX_ETHDEV_DOWN);
321fa790ea9SDavid C Somayajulu
322fa790ea9SDavid C Somayajulu QL_DPRINT12(ha, "exit ha = %p qlnx_rdma_if = %p\n", ha, qlnx_rdma_if);
323fa790ea9SDavid C Somayajulu return;
324fa790ea9SDavid C Somayajulu }
325fa790ea9SDavid C Somayajulu
326fa790ea9SDavid C Somayajulu int
qlnx_rdma_get_num_irqs(struct qlnx_host * ha)327fa790ea9SDavid C Somayajulu qlnx_rdma_get_num_irqs(struct qlnx_host *ha)
328fa790ea9SDavid C Somayajulu {
329fa790ea9SDavid C Somayajulu return (QLNX_NUM_CNQ + ecore_rdma_get_sb_id(&ha->cdev.hwfns[0], 0) + 2);
330fa790ea9SDavid C Somayajulu }
331