1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef	_DAPL_TAVOR_WR_H
28#define	_DAPL_TAVOR_WR_H
29
30/*
31 * dapl_tavor_wr.h
32 *	Contains the definition of all structures that are used for
33 *	doing the work request handling.
34 */
35
36#ifdef __cplusplus
37extern "C" {
38#endif
39
40#include "dapl_osd.h"
41#include "dapl_hash.h"
42#include "dapl_tavor_ibtf.h"
43#include "dapl_tavor_hw.h"
44
45typedef struct dapls_tavor_workq_hdr_s		dapls_tavor_workq_hdr_t;
46typedef struct dapls_tavor_wrid_list_hdr_s	dapls_tavor_wrid_list_hdr_t;
47typedef struct dapls_tavor_wrid_entry_s		dapls_tavor_wrid_entry_t;
48typedef struct dapls_tavor_wrid_lock_s		dapls_tavor_wrid_lock_t;
49
50/*
51 * Defines the lock that protects the wrid list.
52 * For send queues and receive queues this is allocated with the workq header
53 * structure. For SRQs it is allocated with the wrid_list_hdr and the receive
54 * workq header points to it.
55 */
56struct dapls_tavor_wrid_lock_s {
57	uint32_t	wrl_on_srq; /* lock resides in the srq wridlist */
58	DAPL_OS_LOCK	wrl_lock;
59};
60
61/*
62 * Defines the workq header for each queue in the QP. This points to the
63 * dapls_tavor_wrid_list_hdr_t which has the work request id list.
64 */
65struct dapls_tavor_workq_hdr_s {
66	uint32_t			wq_qpn;
67	uint32_t			wq_send_or_recv;
68	dapls_tavor_wrid_lock_t		*wq_wrid_lock;
69	uint32_t			wq_size;
70	uint32_t			wq_head;
71	uint32_t			wq_tail;
72	uint32_t			wq_full;
73	dapls_tavor_wrid_list_hdr_t	*wq_wrid_poll;
74	dapls_tavor_wrid_list_hdr_t	*wq_wrid_post;
75};
76/* Type of the work queue */
77#define	TAVOR_WR_SEND			0x1
78#define	TAVOR_WR_RECV			0x0
79
80
81/*
82 * Defines each work request id entry
83 */
84struct dapls_tavor_wrid_entry_s {
85	uint64_t		wr_wrid;
86	uint32_t		wr_wqeaddrsz;
87	uint32_t		wr_signaled_dbd;
88};
89#define	TAVOR_WRID_ENTRY_SIGNALED	(1 << 0)
90#define	TAVOR_WRID_ENTRY_DOORBELLED	(1 << 1)
91
92/*
93 * Defines each work request id list which has an array of wrid entries
94 */
95struct dapls_tavor_wrid_list_hdr_s {
96	dapls_tavor_wrid_list_hdr_t	*wl_next;
97	dapls_tavor_wrid_list_hdr_t	*wl_prev;
98	dapls_tavor_wrid_list_hdr_t	*wl_reap_next;
99	dapls_tavor_workq_hdr_t		*wl_wqhdr;
100	dapls_tavor_wrid_entry_t	*wl_wre;
101	dapls_tavor_wrid_entry_t	*wl_wre_old_tail;
102	uint32_t			wl_size;
103	uint32_t			wl_full;
104	uint32_t			wl_head;
105	uint32_t			wl_tail;
106	dapls_tavor_wrid_lock_t		*wl_lock; /* valid only for SRQs */
107
108	/* For SRQ */
109	uint_t				wl_srq_en;
110	uint32_t			*wl_free_list; /* free descrptr list */
111	uint32_t			wl_freel_head;
112	uint32_t			wl_freel_tail;
113	uint32_t			wl_freel_entries; /* # free entries */
114	uint32_t			wl_srq_wqesz;
115	uint64_t			wl_srq_desc_addr;
116};
117
118extern dapls_tavor_wrid_entry_t *dapli_tavor_wrid_find_match_srq(
119	dapls_tavor_wrid_list_hdr_t *, tavor_hw_cqe_t *);
120
121#ifdef __cplusplus
122}
123#endif
124
125#endif	/* _DAPL_TAVOR_WR_H */
126