1c0dd49bdSEiji Ota /*
2c0dd49bdSEiji Ota * CDDL HEADER START
3c0dd49bdSEiji Ota *
4c0dd49bdSEiji Ota * The contents of this file are subject to the terms of the
5c0dd49bdSEiji Ota * Common Development and Distribution License (the "License").
6c0dd49bdSEiji Ota * You may not use this file except in compliance with the License.
7c0dd49bdSEiji Ota *
8c0dd49bdSEiji Ota * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9c0dd49bdSEiji Ota * or http://www.opensolaris.org/os/licensing.
10c0dd49bdSEiji Ota * See the License for the specific language governing permissions
11c0dd49bdSEiji Ota * and limitations under the License.
12c0dd49bdSEiji Ota *
13c0dd49bdSEiji Ota * When distributing Covered Code, include this CDDL HEADER in each
14c0dd49bdSEiji Ota * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15c0dd49bdSEiji Ota * If applicable, add the following below this CDDL HEADER, with the
16c0dd49bdSEiji Ota * fields enclosed by brackets "[]" replaced with your own identifying
17c0dd49bdSEiji Ota * information: Portions Copyright [yyyy] [name of copyright owner]
18c0dd49bdSEiji Ota *
19c0dd49bdSEiji Ota * CDDL HEADER END
20c0dd49bdSEiji Ota */
21c0dd49bdSEiji Ota /*
22c0dd49bdSEiji Ota * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
231d99877fSAlexey Zaytsev * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
24c0dd49bdSEiji Ota */
25c0dd49bdSEiji Ota
26c0dd49bdSEiji Ota #ifndef _RDSV3_IMPL_H
27c0dd49bdSEiji Ota #define _RDSV3_IMPL_H
28c0dd49bdSEiji Ota
29c0dd49bdSEiji Ota #include <sys/atomic.h>
30c0dd49bdSEiji Ota
31c0dd49bdSEiji Ota /*
32c0dd49bdSEiji Ota * This file is only present in Solaris
33c0dd49bdSEiji Ota */
34c0dd49bdSEiji Ota
35c0dd49bdSEiji Ota #ifdef __cplusplus
36c0dd49bdSEiji Ota extern "C" {
37c0dd49bdSEiji Ota #endif
38c0dd49bdSEiji Ota
39c0dd49bdSEiji Ota extern dev_info_t *rdsv3_dev_info;
40c0dd49bdSEiji Ota
41c0dd49bdSEiji Ota #define uint16_be_t uint16_t
42c0dd49bdSEiji Ota #define uint32_be_t uint32_t
43c0dd49bdSEiji Ota #define uint64_be_t uint64_t
44c0dd49bdSEiji Ota
45c0dd49bdSEiji Ota /*
46c0dd49bdSEiji Ota * RDS Well known service id
47c0dd49bdSEiji Ota * Format: 0x1h00144Fhhhhhhhh
48c0dd49bdSEiji Ota * "00144F" is the Sun OUI
49c0dd49bdSEiji Ota * 'h' can be any hex-decimal digit.
50c0dd49bdSEiji Ota */
51c0dd49bdSEiji Ota #define RDS_SERVICE_ID 0x1000144F00000001ULL
52c0dd49bdSEiji Ota
53c0dd49bdSEiji Ota /*
54c0dd49bdSEiji Ota * Atomic operations
55c0dd49bdSEiji Ota */
56c0dd49bdSEiji Ota typedef unsigned int atomic_t;
57c0dd49bdSEiji Ota #define ATOMIC_INIT(a) a
58c0dd49bdSEiji Ota
59c0dd49bdSEiji Ota #define atomic_get(p) (*(p))
60c0dd49bdSEiji Ota
61c0dd49bdSEiji Ota #define atomic_cmpset_long(p, c, n) \
62c0dd49bdSEiji Ota ((c == atomic_cas_uint(p, c, n)) ? c : -1)
63c0dd49bdSEiji Ota
64c0dd49bdSEiji Ota #define atomic_dec_and_test(a) \
65c0dd49bdSEiji Ota (atomic_dec_uint_nv((a)) == 0)
66c0dd49bdSEiji Ota
67c0dd49bdSEiji Ota #define atomic_cmpxchg(a, o, n) \
68c0dd49bdSEiji Ota atomic_cas_uint(a, o, n)
69c0dd49bdSEiji Ota
70c0dd49bdSEiji Ota #ifdef _LP64
71c0dd49bdSEiji Ota #define set_bit(b, p) \
72c0dd49bdSEiji Ota atomic_or_ulong(((volatile ulong_t *)(void *)(p)) + ((b) >> 6), \
73c0dd49bdSEiji Ota 1ul << ((b) & 0x3f))
74c0dd49bdSEiji Ota
75c0dd49bdSEiji Ota #define clear_bit(b, p) \
76c0dd49bdSEiji Ota atomic_and_ulong(((volatile ulong_t *)(void *)(p)) + ((b) >> 6), \
77c0dd49bdSEiji Ota ~(1ul << ((b) & 0x3f)))
78c0dd49bdSEiji Ota
79c0dd49bdSEiji Ota #define test_bit(b, p) \
80c0dd49bdSEiji Ota (((volatile ulong_t *)(void *)(p))[(b) >> 6] & (1ul << ((b) & 0x3f)))
81c0dd49bdSEiji Ota
82c0dd49bdSEiji Ota #define test_and_set_bit(b, p) \
83c0dd49bdSEiji Ota atomic_set_long_excl(((ulong_t *)(void *)(p)) + \
84c0dd49bdSEiji Ota ((b) >> 6), ((b) & 0x3f))
85c0dd49bdSEiji Ota #define test_and_clear_bit(b, p) \
86c0dd49bdSEiji Ota !atomic_clear_long_excl(((ulong_t *)(void *)(p)) + ((b) >> 6), \
87c0dd49bdSEiji Ota ((b) & 0x3f))
88c0dd49bdSEiji Ota #else
89c0dd49bdSEiji Ota #define set_bit(b, p) \
90c0dd49bdSEiji Ota atomic_or_uint(((volatile uint_t *)(void *)p) + (b >> 5), \
91c0dd49bdSEiji Ota 1ul << (b & 0x1f))
92c0dd49bdSEiji Ota
93c0dd49bdSEiji Ota #define clear_bit(b, p) \
94c0dd49bdSEiji Ota atomic_and_uint(((volatile uint_t *)(void *)p) + (b >> 5), \
95c0dd49bdSEiji Ota ~(1ul << (b & 0x1f)))
96c0dd49bdSEiji Ota
97c0dd49bdSEiji Ota #define test_bit(b, p) \
98c0dd49bdSEiji Ota (((volatile uint_t *)(void *)p)[b >> 5] & (1ul << (b & 0x1f)))
99c0dd49bdSEiji Ota
100c0dd49bdSEiji Ota #define test_and_set_bit(b, p) \
101c0dd49bdSEiji Ota atomic_set_long_excl(((ulong_t *)(void *)p) + (b >> 5), (b & 0x1f))
102c0dd49bdSEiji Ota #define test_and_clear_bit(b, p) \
103c0dd49bdSEiji Ota !atomic_clear_long_excl(((ulong_t *)(void *)p) + (b >> 5), (b & 0x1f))
104c0dd49bdSEiji Ota #endif
105c0dd49bdSEiji Ota
106cadbfdc3SEiji Ota /*
107cadbfdc3SEiji Ota * These macros and/or constants are used instead of Linux
108cadbfdc3SEiji Ota * generic_{test,__{clear,set}}_le_bit().
109cadbfdc3SEiji Ota */
110cadbfdc3SEiji Ota #if defined(sparc)
111cadbfdc3SEiji Ota #define LE_BIT_XOR ((BITS_PER_LONG-1) & ~0x7)
112cadbfdc3SEiji Ota #else
113cadbfdc3SEiji Ota #define LE_BIT_XOR 0
114cadbfdc3SEiji Ota #endif
115cadbfdc3SEiji Ota
116cadbfdc3SEiji Ota #define set_le_bit(b, p) set_bit(b ^ LE_BIT_XOR, p)
117cadbfdc3SEiji Ota #define clear_le_bit(b, p) clear_bit(b ^ LE_BIT_XOR, p)
118cadbfdc3SEiji Ota #define test_le_bit(b, p) test_bit(b ^ LE_BIT_XOR, p)
119c0dd49bdSEiji Ota
120*66266859SToomas Soome extern uint_t rdsv3_one_sec_in_hz;
121c0dd49bdSEiji Ota
122c0dd49bdSEiji Ota #define jiffies 100
123c0dd49bdSEiji Ota #define HZ (drv_hztousec(1))
124c0dd49bdSEiji Ota /* setting this to PAGESIZE throws build errors */
125c0dd49bdSEiji Ota #define PAGE_SIZE 4096 /* xxx - fix this */
126c0dd49bdSEiji Ota #define BITS_PER_LONG (sizeof (unsigned long) * 8)
127c0dd49bdSEiji Ota
128c0dd49bdSEiji Ota /* debug */
129c0dd49bdSEiji Ota #define RDSV3_PANIC() cmn_err(CE_PANIC, "Panic forced by RDSV3");
130c0dd49bdSEiji Ota
131c0dd49bdSEiji Ota /* ERR */
132c0dd49bdSEiji Ota #define MAX_ERRNO 4095
133c0dd49bdSEiji Ota #define ERR_PTR(x) ((void *)(uintptr_t)x)
134c0dd49bdSEiji Ota #define IS_ERR(ptr) (((uintptr_t)ptr) >= (uintptr_t)-MAX_ERRNO)
135c0dd49bdSEiji Ota #define PTR_ERR(ptr) (int)(uintptr_t)ptr
136c0dd49bdSEiji Ota
137c0dd49bdSEiji Ota #define MAX_SCHEDULE_TIMEOUT (~0UL>>1)
138c0dd49bdSEiji Ota
139c0dd49bdSEiji Ota /* list */
140c0dd49bdSEiji Ota /* copied and modified list_remove_node */
141c0dd49bdSEiji Ota #define list_remove_node(node) \
142c0dd49bdSEiji Ota if ((node)->list_next != NULL) { \
143c0dd49bdSEiji Ota (node)->list_prev->list_next = (node)->list_next; \
144c0dd49bdSEiji Ota (node)->list_next->list_prev = (node)->list_prev; \
145c0dd49bdSEiji Ota (node)->list_next = (node)->list_prev = NULL; \
146c0dd49bdSEiji Ota }
147c0dd49bdSEiji Ota
148c0dd49bdSEiji Ota #define list_splice(src, dst) { \
149c0dd49bdSEiji Ota list_create(dst, (src)->list_size, (src)->list_offset); \
150c0dd49bdSEiji Ota list_move_tail(dst, src); \
151c0dd49bdSEiji Ota }
152c0dd49bdSEiji Ota
153c0dd49bdSEiji Ota #define RDSV3_FOR_EACH_LIST_NODE(objp, listp, member) \
154c0dd49bdSEiji Ota for (objp = list_head(listp); objp; objp = list_next(listp, objp))
155c0dd49bdSEiji Ota #define RDSV3_FOR_EACH_LIST_NODE_SAFE(objp, tmp, listp, member) \
156c0dd49bdSEiji Ota for (objp = list_head(listp), tmp = (objp != NULL) ? \
157c0dd49bdSEiji Ota list_next(listp, objp) : NULL; \
158c0dd49bdSEiji Ota objp; \
159c0dd49bdSEiji Ota objp = tmp, tmp = (objp != NULL) ? \
160c0dd49bdSEiji Ota list_next(listp, objp) : NULL)
161c0dd49bdSEiji Ota
162c0dd49bdSEiji Ota /* simulate wait_queue_head_t */
163c0dd49bdSEiji Ota typedef struct rdsv3_wait_queue_s {
164c0dd49bdSEiji Ota kmutex_t waitq_mutex;
165c0dd49bdSEiji Ota kcondvar_t waitq_cv;
1666e18d381Sagiri uint_t waitq_waiters;
167c0dd49bdSEiji Ota } rdsv3_wait_queue_t;
168c0dd49bdSEiji Ota
169c0dd49bdSEiji Ota #define rdsv3_init_waitqueue(waitqp) \
170c0dd49bdSEiji Ota mutex_init(&(waitqp)->waitq_mutex, NULL, MUTEX_DRIVER, NULL); \
1716e18d381Sagiri cv_init(&(waitqp)->waitq_cv, NULL, CV_DRIVER, NULL); \
1726e18d381Sagiri (waitqp)->waitq_waiters = 0
173c0dd49bdSEiji Ota
174c0dd49bdSEiji Ota #define rdsv3_exit_waitqueue(waitqp) \
1756e18d381Sagiri ASSERT((waitqp)->waitq_waiters == 0); \
176c0dd49bdSEiji Ota mutex_destroy(&(waitqp)->waitq_mutex); \
177c0dd49bdSEiji Ota cv_destroy(&(waitqp)->waitq_cv)
178c0dd49bdSEiji Ota
179c0dd49bdSEiji Ota #define rdsv3_wake_up(waitqp) { \
180c0dd49bdSEiji Ota mutex_enter(&(waitqp)->waitq_mutex); \
1816e18d381Sagiri if ((waitqp)->waitq_waiters) \
1826e18d381Sagiri cv_signal(&(waitqp)->waitq_cv); \
183c0dd49bdSEiji Ota mutex_exit(&(waitqp)->waitq_mutex); \
184c0dd49bdSEiji Ota }
185c0dd49bdSEiji Ota
186c0dd49bdSEiji Ota #define rdsv3_wake_up_all(waitqp) { \
187c0dd49bdSEiji Ota mutex_enter(&(waitqp)->waitq_mutex); \
1886e18d381Sagiri if ((waitqp)->waitq_waiters) \
1896e18d381Sagiri cv_broadcast(&(waitqp)->waitq_cv); \
190c0dd49bdSEiji Ota mutex_exit(&(waitqp)->waitq_mutex); \
191c0dd49bdSEiji Ota }
192c0dd49bdSEiji Ota
1936e18d381Sagiri /* analogous to cv_wait */
194c0dd49bdSEiji Ota #define rdsv3_wait_event(waitq, condition) \
195c0dd49bdSEiji Ota { \
1966e18d381Sagiri mutex_enter(&(waitq)->waitq_mutex); \
1976e18d381Sagiri (waitq)->waitq_waiters++; \
198c0dd49bdSEiji Ota while (!(condition)) { \
1996e18d381Sagiri cv_wait(&(waitq)->waitq_cv, &(waitq)->waitq_mutex); \
200c0dd49bdSEiji Ota } \
2016e18d381Sagiri (waitq)->waitq_waiters--; \
2026e18d381Sagiri mutex_exit(&(waitq)->waitq_mutex); \
2036e18d381Sagiri }
204c0dd49bdSEiji Ota
2056e18d381Sagiri /* analogous to cv_wait_sig */
2066e18d381Sagiri #define rdsv3_wait_sig(waitqp, condition) \
207c0dd49bdSEiji Ota ( \
208c0dd49bdSEiji Ota { \
2096e18d381Sagiri int cv_return = 1; \
2106e18d381Sagiri mutex_enter(&(waitqp)->waitq_mutex); \
2116e18d381Sagiri (waitqp)->waitq_waiters++; \
2126e18d381Sagiri while (!(condition)) { \
2136e18d381Sagiri cv_return = cv_wait_sig(&(waitqp)->waitq_cv, \
2146e18d381Sagiri &(waitqp)->waitq_mutex); \
215c0dd49bdSEiji Ota if (cv_return == 0) { \
216c0dd49bdSEiji Ota break; \
217c0dd49bdSEiji Ota } \
218c0dd49bdSEiji Ota } \
2196e18d381Sagiri (waitqp)->waitq_waiters--; \
2206e18d381Sagiri mutex_exit(&(waitqp)->waitq_mutex); \
221c0dd49bdSEiji Ota cv_return; \
222c0dd49bdSEiji Ota } \
223c0dd49bdSEiji Ota )
224c0dd49bdSEiji Ota
225c0dd49bdSEiji Ota #define SOCK_DEAD 1ul
226c0dd49bdSEiji Ota
227c0dd49bdSEiji Ota /* socket */
228c0dd49bdSEiji Ota typedef struct rsock {
229c0dd49bdSEiji Ota sock_upper_handle_t sk_upper_handle;
230c0dd49bdSEiji Ota sock_upcalls_t *sk_upcalls;
231c0dd49bdSEiji Ota
232c0dd49bdSEiji Ota kmutex_t sk_lock;
233c0dd49bdSEiji Ota ulong_t sk_flag;
2346e18d381Sagiri rdsv3_wait_queue_t *sk_sleep; /* Also protected by rs_recv_lock */
235c0dd49bdSEiji Ota int sk_sndbuf;
236c0dd49bdSEiji Ota int sk_rcvbuf;
237c0dd49bdSEiji Ota atomic_t sk_refcount;
238c0dd49bdSEiji Ota
239c0dd49bdSEiji Ota struct rdsv3_sock *sk_protinfo;
240c0dd49bdSEiji Ota } rsock_t;
241c0dd49bdSEiji Ota
242c0dd49bdSEiji Ota typedef struct rdsv3_conn_info_s {
243c0dd49bdSEiji Ota uint32_be_t c_laddr;
244c0dd49bdSEiji Ota uint32_be_t c_faddr;
245c0dd49bdSEiji Ota } rdsv3_conn_info_t;
246c0dd49bdSEiji Ota
247c0dd49bdSEiji Ota /* WQ */
248c0dd49bdSEiji Ota typedef struct rdsv3_workqueue_struct_s {
249c0dd49bdSEiji Ota kmutex_t wq_lock;
250c0dd49bdSEiji Ota uint_t wq_state;
251c0dd49bdSEiji Ota int wq_pending;
252c0dd49bdSEiji Ota list_t wq_queue;
253c0dd49bdSEiji Ota } rdsv3_workqueue_struct_t;
254c0dd49bdSEiji Ota
255c0dd49bdSEiji Ota struct rdsv3_work_s;
256c0dd49bdSEiji Ota typedef void (*rdsv3_work_func_t)(struct rdsv3_work_s *);
257c0dd49bdSEiji Ota typedef struct rdsv3_work_s {
258c0dd49bdSEiji Ota list_node_t work_item;
259c0dd49bdSEiji Ota rdsv3_work_func_t func;
260c0dd49bdSEiji Ota } rdsv3_work_t;
261c0dd49bdSEiji Ota
262c0dd49bdSEiji Ota /* simulate delayed_work */
263c0dd49bdSEiji Ota typedef struct rdsv3_delayed_work_s {
264c0dd49bdSEiji Ota kmutex_t lock;
265c0dd49bdSEiji Ota rdsv3_work_t work;
266c0dd49bdSEiji Ota timeout_id_t timeid;
267c0dd49bdSEiji Ota rdsv3_workqueue_struct_t *wq;
268c0dd49bdSEiji Ota } rdsv3_delayed_work_t;
269c0dd49bdSEiji Ota
270c0dd49bdSEiji Ota #define RDSV3_INIT_WORK(wp, f) (wp)->func = f
271c0dd49bdSEiji Ota #define RDSV3_INIT_DELAYED_WORK(dwp, f) \
272c0dd49bdSEiji Ota (dwp)->work.func = f; \
273c0dd49bdSEiji Ota mutex_init(&(dwp)->lock, NULL, MUTEX_DRIVER, NULL); \
274c0dd49bdSEiji Ota (dwp)->timeid = 0
275c0dd49bdSEiji Ota
276c0dd49bdSEiji Ota /* simulate scatterlist */
277c0dd49bdSEiji Ota struct rdsv3_scatterlist {
278c0dd49bdSEiji Ota caddr_t vaddr;
279c0dd49bdSEiji Ota uint_t length;
280c0dd49bdSEiji Ota ibt_wr_ds_t *sgl;
281c0dd49bdSEiji Ota ibt_mi_hdl_t mihdl;
282c0dd49bdSEiji Ota };
283c0dd49bdSEiji Ota #define rdsv3_sg_page(scat) (scat)->vaddr
284c0dd49bdSEiji Ota #define rdsv3_sg_len(scat) (scat)->length
285c0dd49bdSEiji Ota #define rdsv3_sg_set_page(scat, pg, len, off) \
286c0dd49bdSEiji Ota (scat)->vaddr = (caddr_t)(pg + off); \
287c0dd49bdSEiji Ota (scat)->length = len
288c0dd49bdSEiji Ota #define rdsv3_ib_sg_dma_len(dev, scat) rdsv3_sg_len(scat)
289c0dd49bdSEiji Ota
290c0dd49bdSEiji Ota /* copied from sys/socket.h */
291c0dd49bdSEiji Ota #if defined(__sparc)
292c0dd49bdSEiji Ota /* To maintain backward compatibility, alignment needs to be 8 on sparc. */
293c0dd49bdSEiji Ota #define _CMSG_HDR_ALIGNMENT 8
294c0dd49bdSEiji Ota #else
295c0dd49bdSEiji Ota /* for __i386 (and other future architectures) */
296c0dd49bdSEiji Ota #define _CMSG_HDR_ALIGNMENT 4
297c0dd49bdSEiji Ota #endif /* defined(__sparc) */
298c0dd49bdSEiji Ota
299c0dd49bdSEiji Ota /*
300c0dd49bdSEiji Ota * The cmsg headers (and macros dealing with them) were made available as
301c0dd49bdSEiji Ota * part of UNIX95 and hence need to be protected with a _XPG4_2 define.
302c0dd49bdSEiji Ota */
303c0dd49bdSEiji Ota #define _CMSG_DATA_ALIGNMENT (sizeof (int))
304c0dd49bdSEiji Ota #define _CMSG_HDR_ALIGN(x) (((uintptr_t)(x) + _CMSG_HDR_ALIGNMENT - 1) & \
305c0dd49bdSEiji Ota ~(_CMSG_HDR_ALIGNMENT - 1))
306c0dd49bdSEiji Ota #define _CMSG_DATA_ALIGN(x) (((uintptr_t)(x) + _CMSG_DATA_ALIGNMENT - 1) & \
307c0dd49bdSEiji Ota ~(_CMSG_DATA_ALIGNMENT - 1))
308c0dd49bdSEiji Ota #define CMSG_DATA(c) \
309c0dd49bdSEiji Ota ((unsigned char *)_CMSG_DATA_ALIGN((struct cmsghdr *)(c) + 1))
310c0dd49bdSEiji Ota
311c0dd49bdSEiji Ota #define CMSG_FIRSTHDR(m) \
312c0dd49bdSEiji Ota (((m)->msg_controllen < sizeof (struct cmsghdr)) ? \
313c0dd49bdSEiji Ota (struct cmsghdr *)0 : (struct cmsghdr *)((m)->msg_control))
314c0dd49bdSEiji Ota
315c0dd49bdSEiji Ota #define CMSG_NXTHDR(m, c) \
316c0dd49bdSEiji Ota (((c) == 0) ? CMSG_FIRSTHDR(m) : \
317c0dd49bdSEiji Ota ((((uintptr_t)_CMSG_HDR_ALIGN((char *)(c) + \
318c0dd49bdSEiji Ota ((struct cmsghdr *)(c))->cmsg_len) + sizeof (struct cmsghdr)) > \
319c0dd49bdSEiji Ota (((uintptr_t)((struct msghdr *)(m))->msg_control) + \
320c0dd49bdSEiji Ota ((uintptr_t)((struct msghdr *)(m))->msg_controllen))) ? \
321c0dd49bdSEiji Ota ((struct cmsghdr *)0) : \
322c0dd49bdSEiji Ota ((struct cmsghdr *)_CMSG_HDR_ALIGN((char *)(c) + \
323c0dd49bdSEiji Ota ((struct cmsghdr *)(c))->cmsg_len))))
324c0dd49bdSEiji Ota
325c0dd49bdSEiji Ota /* Amount of space + padding needed for a message of length l */
326c0dd49bdSEiji Ota #define CMSG_SPACE(l) \
327c0dd49bdSEiji Ota ((unsigned int)_CMSG_HDR_ALIGN(sizeof (struct cmsghdr) + (l)))
328c0dd49bdSEiji Ota
329c0dd49bdSEiji Ota /* Value to be used in cmsg_len, does not include trailing padding */
330c0dd49bdSEiji Ota #define CMSG_LEN(l) \
331c0dd49bdSEiji Ota ((unsigned int)_CMSG_DATA_ALIGN(sizeof (struct cmsghdr)) + (l))
332c0dd49bdSEiji Ota
333c0dd49bdSEiji Ota /* OFUV -> IB */
334c0dd49bdSEiji Ota #define RDSV3_IBDEV2HCAHDL(device) (device)->hca_hdl
335c0dd49bdSEiji Ota #define RDSV3_QP2CHANHDL(qp) (qp)->ibt_qp
336c0dd49bdSEiji Ota #define RDSV3_PD2PDHDL(pd) (pd)->ibt_pd
337c0dd49bdSEiji Ota #define RDSV3_CQ2CQHDL(cq) (cq)->ibt_cq
338c0dd49bdSEiji Ota
339c0dd49bdSEiji Ota struct rdsv3_hdrs_mr {
340c0dd49bdSEiji Ota ibt_lkey_t lkey;
341c0dd49bdSEiji Ota caddr_t addr;
342c0dd49bdSEiji Ota size_t size;
343c0dd49bdSEiji Ota ibt_mr_hdl_t hdl;
344c0dd49bdSEiji Ota };
345c0dd49bdSEiji Ota
346c0dd49bdSEiji Ota /* rdsv3_impl.c */
347c0dd49bdSEiji Ota void rdsv3_trans_init();
348c0dd49bdSEiji Ota boolean_t rdsv3_capable_interface(struct lifreq *lifrp);
349c0dd49bdSEiji Ota int rdsv3_do_ip_ioctl(ksocket_t so4, void **ipaddrs, int *size, int *nifs);
350c0dd49bdSEiji Ota int rdsv3_do_ip_ioctl_old(ksocket_t so4, void **ipaddrs, int *size, int *nifs);
351c0dd49bdSEiji Ota boolean_t rdsv3_isloopback(ipaddr_t addr);
352c0dd49bdSEiji Ota void rdsv3_cancel_delayed_work(rdsv3_delayed_work_t *dwp);
353c0dd49bdSEiji Ota void rdsv3_flush_workqueue(rdsv3_workqueue_struct_t *wq);
354c0dd49bdSEiji Ota void rdsv3_queue_work(rdsv3_workqueue_struct_t *wq, rdsv3_work_t *wp);
355c0dd49bdSEiji Ota void rdsv3_queue_delayed_work(rdsv3_workqueue_struct_t *wq,
356c0dd49bdSEiji Ota rdsv3_delayed_work_t *dwp, uint_t delay);
357c0dd49bdSEiji Ota struct rsock *rdsv3_sk_alloc();
358c0dd49bdSEiji Ota void rdsv3_sock_init_data(struct rsock *sk);
359c0dd49bdSEiji Ota void rdsv3_sock_exit_data(struct rsock *sk);
360c0dd49bdSEiji Ota void rdsv3_destroy_task_workqueue(rdsv3_workqueue_struct_t *wq);
361c0dd49bdSEiji Ota rdsv3_workqueue_struct_t *rdsv3_create_task_workqueue(char *name);
362c0dd49bdSEiji Ota int rdsv3_conn_constructor(void *buf, void *arg, int kmflags);
363c0dd49bdSEiji Ota void rdsv3_conn_destructor(void *buf, void *arg);
364c0dd49bdSEiji Ota int rdsv3_conn_compare(const void *conn1, const void *conn2);
365c0dd49bdSEiji Ota void rdsv3_loop_init();
366c0dd49bdSEiji Ota int rdsv3_mr_compare(const void *mr1, const void *mr2);
367c0dd49bdSEiji Ota int rdsv3_put_cmsg(struct nmsghdr *msg, int level, int type, size_t size,
368c0dd49bdSEiji Ota void *payload);
369c0dd49bdSEiji Ota int rdsv3_verify_bind_address(ipaddr_t addr);
370c0dd49bdSEiji Ota uint16_t rdsv3_ip_fast_csum(void *buffer, size_t length);
371c0dd49bdSEiji Ota uint_t rdsv3_ib_dma_map_sg(struct ib_device *dev, struct rdsv3_scatterlist
372c0dd49bdSEiji Ota *scat, uint_t num);
373c0dd49bdSEiji Ota void rdsv3_ib_dma_unmap_sg(ib_device_t *dev, struct rdsv3_scatterlist *scat,
374c0dd49bdSEiji Ota uint_t num);
3751a561c76SEiji Ota static inline void
rdsv3_sk_sock_hold(struct rsock * sk)376c0dd49bdSEiji Ota rdsv3_sk_sock_hold(struct rsock *sk)
377c0dd49bdSEiji Ota {
3781a5e258fSJosef 'Jeff' Sipek atomic_inc_32(&sk->sk_refcount);
379c0dd49bdSEiji Ota }
3801a561c76SEiji Ota static inline void
rdsv3_sk_sock_put(struct rsock * sk)381c0dd49bdSEiji Ota rdsv3_sk_sock_put(struct rsock *sk)
382c0dd49bdSEiji Ota {
383c0dd49bdSEiji Ota if (atomic_dec_and_test(&sk->sk_refcount))
384c0dd49bdSEiji Ota rdsv3_sock_exit_data(sk);
385c0dd49bdSEiji Ota }
3861a561c76SEiji Ota static inline int
rdsv3_sk_sock_flag(struct rsock * sk,uint_t flag)387c0dd49bdSEiji Ota rdsv3_sk_sock_flag(struct rsock *sk, uint_t flag)
388c0dd49bdSEiji Ota {
389c0dd49bdSEiji Ota return (test_bit(flag, &sk->sk_flag));
390c0dd49bdSEiji Ota }
3911a561c76SEiji Ota static inline void
rdsv3_sk_sock_orphan(struct rsock * sk)392c0dd49bdSEiji Ota rdsv3_sk_sock_orphan(struct rsock *sk)
393c0dd49bdSEiji Ota {
394c0dd49bdSEiji Ota set_bit(SOCK_DEAD, &sk->sk_flag);
395c0dd49bdSEiji Ota }
396c0dd49bdSEiji Ota
397cadbfdc3SEiji Ota #define rdsv3_sndtimeo(a, b) b ? 0 : 3600 /* check this value on linux */
398cadbfdc3SEiji Ota #define rdsv3_rcvtimeo(a, b) b ? 0 : 3600 /* check this value on linux */
399c0dd49bdSEiji Ota
400c0dd49bdSEiji Ota void rdsv3_ib_free_conn(void *arg);
401c0dd49bdSEiji Ota
402c0dd49bdSEiji Ota #ifdef __cplusplus
403c0dd49bdSEiji Ota }
404c0dd49bdSEiji Ota #endif
405c0dd49bdSEiji Ota
406c0dd49bdSEiji Ota #endif /* _RDSV3_IMPL_H */
407