1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source. A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * This file is part of the Chelsio T4 support code.
14  *
15  * Copyright (C) 2010-2013 Chelsio Communications.  All rights reserved.
16  *
17  * This program is distributed in the hope that it will be useful, but WITHOUT
18  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19  * FITNESS FOR A PARTICULAR PURPOSE.  See the LICENSE file included in this
20  * release for licensing terms and conditions.
21  */
22 
23 #ifndef __CXGBE_OFFLOAD_H
24 #define	__CXGBE_OFFLOAD_H
25 
26 /*
27  * Max # of ATIDs.  The absolute HW max is 16K but we keep it lower.
28  */
29 #define	MAX_ATIDS 8192U
30 
31 #define	INIT_ULPTX_WR(w, wrlen, atomic, tid) do { \
32 	(w)->wr.wr_hi = htonl(V_FW_WR_OP(FW_ULPTX_WR) | \
33 		V_FW_WR_ATOMIC(atomic)); \
34 	(w)->wr.wr_mid = htonl(V_FW_WR_LEN16(DIV_ROUND_UP(wrlen, 16)) | \
35 		V_FW_WR_FLOWID(tid)); \
36 	(w)->wr.wr_lo = cpu_to_be64(0); \
37 } while (0)
38 
39 #define	INIT_TP_WR(w, tid) do { \
40 	(w)->wr.wr_hi = htonl(V_FW_WR_OP(FW_TP_WR) | \
41 		V_FW_WR_IMMDLEN(sizeof (*w) - sizeof (w->wr))); \
42 	(w)->wr.wr_mid = htonl(V_FW_WR_LEN16(DIV_ROUND_UP(sizeof (*w), 16)) | \
43 		V_FW_WR_FLOWID(tid)); \
44 	(w)->wr.wr_lo = cpu_to_be64(0); \
45 } while (0)
46 
47 #define	INIT_TP_WR_MIT_CPL(w, cpl, tid) do { \
48 	INIT_TP_WR(w, tid); \
49 	OPCODE_TID(w) = htonl(MK_OPCODE_TID(cpl, tid)); \
50 } while (0)
51 
52 union serv_entry {
53 	void *data;
54 	union serv_entry *next;
55 };
56 
57 union aopen_entry {
58 	void *data;
59 	union aopen_entry *next;
60 };
61 
62 /*
63  * Holds the size, base address, free list start, etc of the TID, server TID,
64  * and active-open TID tables.  The tables themselves are allocated dynamically.
65  */
66 struct tid_info {
67 	void **tid_tab;
68 	unsigned int ntids;
69 
70 	union serv_entry *stid_tab;
71 	unsigned int nstids;
72 	unsigned int stid_base;
73 
74 	union aopen_entry *atid_tab;
75 	unsigned int natids;
76 
77 	struct filter_entry *ftid_tab;
78 	unsigned int nftids;
79 	unsigned int ftid_base;
80 	unsigned int ftids_in_use;
81 
82 	kmutex_t atid_lock;
83 	union aopen_entry *afree;
84 	unsigned int atids_in_use;
85 
86 	kmutex_t stid_lock;
87 	union serv_entry *sfree;
88 	unsigned int stids_in_use;
89 
90 	unsigned int tids_in_use;
91 };
92 
93 struct t4_range {
94 	u_int start;
95 	u_int size;
96 };
97 
98 struct t4_virt_res {		/* virtualized HW resources */
99 	struct t4_range ddp;
100 	struct t4_range iscsi;
101 	struct t4_range stag;
102 	struct t4_range rq;
103 	struct t4_range pbl;
104 	struct t4_range l2t;
105 };
106 
107 struct adapter;
108 struct port_info;
109 
110 enum {
111 	ULD_TOM = 1,
112 };
113 
114 enum cxgb4_control {
115 	CXGB4_CONTROL_SET_OFFLOAD_POLICY,
116 };
117 
118 struct uld_info {
119 	SLIST_ENTRY(uld_info) link;
120 	int refcount;
121 	int uld_id;
122 	int (*attach)(struct adapter *, void **);
123 	int (*detach)(void *);
124 	int (*rx)(void *, const void *, mblk_t *);
125 	int (*control)(void *handle, enum cxgb4_control control, ...);
126 };
127 
128 struct uld_softc {
129 	struct uld_info *uld;
130 	void *softc;
131 };
132 
133 struct tom_tunables {
134 	int sndbuf;
135 	int ddp;
136 	int indsz;
137 	int ddp_thres;
138 };
139 
140 #ifdef TCP_OFFLOAD_ENABLE
141 struct offload_req {
142 	__be32 sip[4];
143 	__be32 dip[4];
144 	__be16 sport;
145 	__be16 dport;
146 	__u8   ipvers_opentype;
147 	__u8   tos;
148 	__be16 vlan;
149 	__u32  mark;
150 };
151 
152 enum { OPEN_TYPE_LISTEN, OPEN_TYPE_ACTIVE, OPEN_TYPE_PASSIVE };
153 
154 struct offload_settings {
155 	__u8  offload;
156 	int8_t  ddp;
157 	int8_t  rx_coalesce;
158 	int8_t  cong_algo;
159 	int32_t	rssq;
160 	int16_t sched_class;
161 	int8_t  tstamp;
162 	int8_t  sack;
163 
164 };
165 #endif
166 
167 extern int t4_register_uld(struct uld_info *ui);
168 extern int t4_unregister_uld(struct uld_info *ui);
169 
170 #endif /* __CXGBE_OFFLOAD_H */
171