1 /*******************************************************************************
3 * Copyright (c) 2015-2016 Intel Corporation. All rights reserved.
5 * This software is available to you under a choice of one of two
6 * licenses. You may choose to be licensed under the terms of the GNU
7 * General Public License (GPL) Version 2, available from the file
8 * COPYING in the main directory of this source tree, or the
9 * OpenFabrics.org BSD license below:
11 * Redistribution and use in source and binary forms, with or
12 * without modification, are permitted provided that the following
15 * - Redistributions of source code must retain the above
16 * copyright notice, this list of conditions and the following
19 * - Redistributions in binary form must reproduce the above
20 * copyright notice, this list of conditions and the following
21 * disclaimer in the documentation and/or other materials
22 * provided with the distribution.
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33 *******************************************************************************/
38 #define I40IW_IEQ_MPA_FRAMING 6
44 enum puda_resource_type
{
45 I40IW_PUDA_RSRC_TYPE_ILQ
= 1,
46 I40IW_PUDA_RSRC_TYPE_IEQ
49 enum puda_rsrc_complete
{
54 PUDA_HASH_CRC_COMPLETE
57 struct i40iw_puda_completion_info
{
58 struct i40iw_qp_uk
*qp
;
64 u32 compl_error
; /* No_err=0, else major and minor err code */
69 struct i40iw_puda_send_info
{
70 u64 paddr
; /* Physical address */
79 struct i40iw_puda_buf
{
80 struct list_head list
; /* MUST be first entry */
81 struct i40iw_dma_mem mem
; /* DMA memory for the buffer */
82 struct i40iw_puda_buf
*next
; /* for alloclist in rsrc struct */
83 struct i40iw_virt_mem buf_mem
; /* Buffer memory for this buffer */
90 u8 tcphlen
; /* tcp length in bytes */
91 u8 maclen
; /* mac length in bytes */
92 u32 totallen
; /* machlen+iphlen+tcphlen+datalen */
99 struct i40iw_puda_rsrc_info
{
100 enum puda_resource_type type
; /* ILQ or IEQ */
109 u32 tx_buf_cnt
; /* total bufs allocated will be rq_size + tx_buf_cnt */
110 void (*receive
)(struct i40iw_sc_vsi
*, struct i40iw_puda_buf
*);
111 void (*xmit_complete
)(struct i40iw_sc_vsi
*, void *);
114 struct i40iw_puda_rsrc
{
115 struct i40iw_sc_cq cq
;
116 struct i40iw_sc_qp qp
;
117 struct i40iw_sc_pd sc_pd
;
118 struct i40iw_sc_dev
*dev
;
119 struct i40iw_sc_vsi
*vsi
;
120 struct i40iw_dma_mem cqmem
;
121 struct i40iw_dma_mem qpmem
;
122 struct i40iw_virt_mem ilq_mem
;
123 enum puda_rsrc_complete completion
;
124 enum puda_resource_type type
;
125 u16 buf_size
; /*buffer must be max datalen + tcpip hdr + mac */
132 struct i40iw_sq_uk_wr_trk_info
*sq_wrtrk_array
;
137 u32 tx_wqe_avail_cnt
;
139 struct shash_desc
*hash_desc
;
140 struct list_head txpend
;
141 struct list_head bufpool
; /* free buffers pool list for recv and xmit */
143 u32 avail_buf_count
; /* snapshot of currently available buffers */
144 spinlock_t bufpool_lock
;
145 struct i40iw_puda_buf
*alloclist
;
146 void (*receive
)(struct i40iw_sc_vsi
*, struct i40iw_puda_buf
*);
147 void (*xmit_complete
)(struct i40iw_sc_vsi
*, void *);
149 u64 stats_buf_alloc_fail
;
152 u64 stats_rcvd_pkt_err
;
153 u64 stats_sent_pkt_q
;
157 struct i40iw_puda_buf
*i40iw_puda_get_bufpool(struct i40iw_puda_rsrc
*rsrc
);
158 void i40iw_puda_ret_bufpool(struct i40iw_puda_rsrc
*rsrc
,
159 struct i40iw_puda_buf
*buf
);
160 void i40iw_puda_send_buf(struct i40iw_puda_rsrc
*rsrc
,
161 struct i40iw_puda_buf
*buf
);
162 enum i40iw_status_code
i40iw_puda_send(struct i40iw_sc_qp
*qp
,
163 struct i40iw_puda_send_info
*info
);
164 enum i40iw_status_code
i40iw_puda_create_rsrc(struct i40iw_sc_vsi
*vsi
,
165 struct i40iw_puda_rsrc_info
*info
);
166 void i40iw_puda_dele_resources(struct i40iw_sc_vsi
*vsi
,
167 enum puda_resource_type type
,
169 enum i40iw_status_code
i40iw_puda_poll_completion(struct i40iw_sc_dev
*dev
,
170 struct i40iw_sc_cq
*cq
, u32
*compl_err
);
172 struct i40iw_sc_qp
*i40iw_ieq_get_qp(struct i40iw_sc_dev
*dev
,
173 struct i40iw_puda_buf
*buf
);
174 enum i40iw_status_code
i40iw_puda_get_tcpip_info(struct i40iw_puda_completion_info
*info
,
175 struct i40iw_puda_buf
*buf
);
176 enum i40iw_status_code
i40iw_ieq_check_mpacrc(struct shash_desc
*desc
,
177 void *addr
, u32 length
, u32 value
);
178 enum i40iw_status_code
i40iw_init_hash_desc(struct shash_desc
**desc
);
179 void i40iw_ieq_mpa_crc_ae(struct i40iw_sc_dev
*dev
, struct i40iw_sc_qp
*qp
);
180 void i40iw_free_hash_desc(struct shash_desc
*desc
);
181 void i40iw_ieq_update_tcpip_info(struct i40iw_puda_buf
*buf
, u16 length
,
183 enum i40iw_status_code
i40iw_cqp_qp_create_cmd(struct i40iw_sc_dev
*dev
, struct i40iw_sc_qp
*qp
);
184 enum i40iw_status_code
i40iw_cqp_cq_create_cmd(struct i40iw_sc_dev
*dev
, struct i40iw_sc_cq
*cq
);
185 void i40iw_cqp_qp_destroy_cmd(struct i40iw_sc_dev
*dev
, struct i40iw_sc_qp
*qp
);
186 void i40iw_cqp_cq_destroy_cmd(struct i40iw_sc_dev
*dev
, struct i40iw_sc_cq
*cq
);
187 void i40iw_ieq_cleanup_qp(struct i40iw_puda_rsrc
*ieq
, struct i40iw_sc_qp
*qp
);