1*d14abf15SRobert Mustacchi /*******************************************************************************
2*d14abf15SRobert Mustacchi * lm_l4if.h - L4 lm interface
3*d14abf15SRobert Mustacchi ******************************************************************************/
4*d14abf15SRobert Mustacchi #ifndef _LM_L4IF_H
5*d14abf15SRobert Mustacchi #define _LM_L4IF_H
6*d14abf15SRobert Mustacchi 
7*d14abf15SRobert Mustacchi lm_status_t lm_tcp_init_chip_common(
8*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev);
9*d14abf15SRobert Mustacchi 
10*d14abf15SRobert Mustacchi lm_status_t lm_tcp_init(
11*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev);
12*d14abf15SRobert Mustacchi 
13*d14abf15SRobert Mustacchi lm_status_t lm_tcp_init_resc(struct _lm_device_t *pdev, u8_t b_is_init );
14*d14abf15SRobert Mustacchi lm_status_t lm_tcp_init_chip(struct _lm_device_t *pdev);
15*d14abf15SRobert Mustacchi lm_status_t lm_tcp_start_chip(struct _lm_device_t *pdev);
16*d14abf15SRobert Mustacchi 
17*d14abf15SRobert Mustacchi lm_status_t
18*d14abf15SRobert Mustacchi lm_tcp_set_ofld_params(
19*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
20*d14abf15SRobert Mustacchi     lm_state_block_t *state_blk,
21*d14abf15SRobert Mustacchi     l4_ofld_params_t *params);
22*d14abf15SRobert Mustacchi 
23*d14abf15SRobert Mustacchi lm_status_t lm_tcp_init_neigh_state(
24*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
25*d14abf15SRobert Mustacchi     lm_state_block_t *state_blk,
26*d14abf15SRobert Mustacchi     lm_neigh_state_t *neigh,
27*d14abf15SRobert Mustacchi     l4_neigh_const_state_t *neigh_const,
28*d14abf15SRobert Mustacchi     l4_neigh_cached_state_t *neigh_cached,
29*d14abf15SRobert Mustacchi     l4_neigh_delegated_state_t *neigh_delegated);
30*d14abf15SRobert Mustacchi 
31*d14abf15SRobert Mustacchi lm_status_t lm_tcp_init_path_state(
32*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
33*d14abf15SRobert Mustacchi     lm_state_block_t *state_blk,
34*d14abf15SRobert Mustacchi     lm_path_state_t *path,
35*d14abf15SRobert Mustacchi     lm_neigh_state_t *neigh,
36*d14abf15SRobert Mustacchi     l4_path_const_state_t *path_const,
37*d14abf15SRobert Mustacchi     l4_path_cached_state_t *path_cached,
38*d14abf15SRobert Mustacchi     l4_path_delegated_state_t *path_delegated);
39*d14abf15SRobert Mustacchi 
40*d14abf15SRobert Mustacchi lm_status_t lm_tcp_init_tcp_state(
41*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
42*d14abf15SRobert Mustacchi     lm_state_block_t *state_blk,
43*d14abf15SRobert Mustacchi     lm_tcp_state_t *tcp,
44*d14abf15SRobert Mustacchi     lm_path_state_t *path,
45*d14abf15SRobert Mustacchi     l4_tcp_const_state_t *tcp_const,
46*d14abf15SRobert Mustacchi     l4_tcp_cached_state_t *tcp_cached,
47*d14abf15SRobert Mustacchi     l4_tcp_delegated_state_t *tcp_delegated,
48*d14abf15SRobert Mustacchi     u32_t tcp_cid_addr);
49*d14abf15SRobert Mustacchi 
50*d14abf15SRobert Mustacchi /** Description:
51*d14abf15SRobert Mustacchi  *   Initialize the tx/rx connection fields and resources
52*d14abf15SRobert Mustacchi  * Parameters
53*d14abf15SRobert Mustacchi  *   - mblk: memory block for the virtual memory
54*d14abf15SRobert Mustacchi  *   - phy_mblk: memory block for the physical memory
55*d14abf15SRobert Mustacchi  */
56*d14abf15SRobert Mustacchi lm_status_t lm_tcp_init_tcp_resc(
57*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
58*d14abf15SRobert Mustacchi     lm_tcp_state_t *tcp,
59*d14abf15SRobert Mustacchi     lm_tcp_mem_block_t * mblk,
60*d14abf15SRobert Mustacchi     lm_tcp_phy_mem_block_t * phy_mblk);
61*d14abf15SRobert Mustacchi 
62*d14abf15SRobert Mustacchi /** Description
63*d14abf15SRobert Mustacchi  * Post buffered data
64*d14abf15SRobert Mustacchi  */
65*d14abf15SRobert Mustacchi lm_status_t lm_tcp_post_buffered_data(
66*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
67*d14abf15SRobert Mustacchi     lm_tcp_state_t *tcp,
68*d14abf15SRobert Mustacchi     d_list_t *buffered_data);
69*d14abf15SRobert Mustacchi 
70*d14abf15SRobert Mustacchi /** Description
71*d14abf15SRobert Mustacchi  * Init sp_data phys and virt memory for a given tcp state to
72*d14abf15SRobert Mustacchi  * the sp_req_mgr sp_data memory
73*d14abf15SRobert Mustacchi  */
74*d14abf15SRobert Mustacchi void lm_tcp_init_tcp_sp_data_mem(
75*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
76*d14abf15SRobert Mustacchi     lm_tcp_state_t *tcp
77*d14abf15SRobert Mustacchi     );
78*d14abf15SRobert Mustacchi 
79*d14abf15SRobert Mustacchi /** Description:
80*d14abf15SRobert Mustacchi  *   Initialize the common fields, or fields specific for rx/tx that use the
81*d14abf15SRobert Mustacchi  *   same space in the memory block (such as doorbell-data)
82*d14abf15SRobert Mustacchi  * Parameters
83*d14abf15SRobert Mustacchi  *   - mblk: memory block for the virtual memory
84*d14abf15SRobert Mustacchi  *   - phy_mblk: memory block for the physical memory
85*d14abf15SRobert Mustacchi  */
86*d14abf15SRobert Mustacchi lm_status_t lm_tcp_init_tcp_common(
87*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
88*d14abf15SRobert Mustacchi     lm_tcp_state_t *tcp);
89*d14abf15SRobert Mustacchi 
90*d14abf15SRobert Mustacchi /* Get the required size for a connections virtual memory
91*d14abf15SRobert Mustacchi  * Parameters:
92*d14abf15SRobert Mustacchi  * - tcp_state: A specific tcp state that the size is requested for. If NULL, then
93*d14abf15SRobert Mustacchi  *   the default size is returned
94*d14abf15SRobert Mustacchi  */
95*d14abf15SRobert Mustacchi u32_t lm_tcp_get_virt_size(
96*d14abf15SRobert Mustacchi     struct _lm_device_t * pdev,
97*d14abf15SRobert Mustacchi     lm_tcp_state_t * tcp_state);
98*d14abf15SRobert Mustacchi 
99*d14abf15SRobert Mustacchi /* Get the required size for a connections physical memory
100*d14abf15SRobert Mustacchi  * Assumptions: Physical memory size is the same for all connections
101*d14abf15SRobert Mustacchi  */
102*d14abf15SRobert Mustacchi u32_t lm_tcp_get_phys_size(
103*d14abf15SRobert Mustacchi     struct _lm_device_t * pdev);
104*d14abf15SRobert Mustacchi 
105*d14abf15SRobert Mustacchi lm_status_t lm_tcp_post_upload_path_request (
106*d14abf15SRobert Mustacchi     struct _lm_device_t * pdev,
107*d14abf15SRobert Mustacchi     lm_path_state_t * path_state,
108*d14abf15SRobert Mustacchi     l4_path_delegated_state_t * ret_delegated);
109*d14abf15SRobert Mustacchi 
110*d14abf15SRobert Mustacchi lm_status_t lm_tcp_post_upload_neigh_request(
111*d14abf15SRobert Mustacchi     struct _lm_device_t * pdev,
112*d14abf15SRobert Mustacchi     lm_neigh_state_t * neigh_state);
113*d14abf15SRobert Mustacchi 
114*d14abf15SRobert Mustacchi /* Desciption:
115*d14abf15SRobert Mustacchi  *  delete tcp state from lm _except_ from actual freeing of memory.
116*d14abf15SRobert Mustacchi  *  the task of freeing of memory is done in lm_tcp_free_tcp_state()
117*d14abf15SRobert Mustacchi  * Assumptions:
118*d14abf15SRobert Mustacchi  *  global toe lock is taken by the caller
119*d14abf15SRobert Mustacchi  */
120*d14abf15SRobert Mustacchi void lm_tcp_del_tcp_state(
121*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
122*d14abf15SRobert Mustacchi     lm_tcp_state_t *tcp);
123*d14abf15SRobert Mustacchi 
124*d14abf15SRobert Mustacchi /* Desciption:
125*d14abf15SRobert Mustacchi  *  delete path state from lm
126*d14abf15SRobert Mustacchi  * Assumptions:
127*d14abf15SRobert Mustacchi  *  global toe lock is taken by the caller
128*d14abf15SRobert Mustacchi  */
129*d14abf15SRobert Mustacchi void lm_tcp_del_path_state(
130*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
131*d14abf15SRobert Mustacchi     lm_path_state_t *path);
132*d14abf15SRobert Mustacchi 
133*d14abf15SRobert Mustacchi /* Desciption:
134*d14abf15SRobert Mustacchi  *  delete neigh state from lm
135*d14abf15SRobert Mustacchi  * Assumptions:
136*d14abf15SRobert Mustacchi  *  global toe lock is taken by the caller
137*d14abf15SRobert Mustacchi  */
138*d14abf15SRobert Mustacchi void lm_tcp_del_neigh_state(
139*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
140*d14abf15SRobert Mustacchi     lm_neigh_state_t *neigh);
141*d14abf15SRobert Mustacchi 
142*d14abf15SRobert Mustacchi void lm_tcp_free_tcp_resc(
143*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
144*d14abf15SRobert Mustacchi     lm_tcp_state_t *tcp);
145*d14abf15SRobert Mustacchi 
146*d14abf15SRobert Mustacchi lm_status_t lm_tcp_post_slow_path_request(
147*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
148*d14abf15SRobert Mustacchi     lm_tcp_state_t *tcp,
149*d14abf15SRobert Mustacchi     lm_tcp_slow_path_request_t *request);
150*d14abf15SRobert Mustacchi 
151*d14abf15SRobert Mustacchi /* initiate offload request completion */
152*d14abf15SRobert Mustacchi void lm_tcp_comp_initiate_offload_request(
153*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
154*d14abf15SRobert Mustacchi     lm_tcp_state_t *tcp,
155*d14abf15SRobert Mustacchi     u32_t comp_status);
156*d14abf15SRobert Mustacchi 
157*d14abf15SRobert Mustacchi lm_status_t lm_tcp_tx_post_buf(
158*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
159*d14abf15SRobert Mustacchi     lm_tcp_state_t      *tcp,
160*d14abf15SRobert Mustacchi     lm_tcp_buffer_t     *tcp_buf,
161*d14abf15SRobert Mustacchi     lm_frag_list_t      *frag_list);
162*d14abf15SRobert Mustacchi 
163*d14abf15SRobert Mustacchi 
164*d14abf15SRobert Mustacchi 
165*d14abf15SRobert Mustacchi lm_status_t lm_tcp_rx_post_buf(
166*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
167*d14abf15SRobert Mustacchi     lm_tcp_state_t      *tcp,
168*d14abf15SRobert Mustacchi     lm_tcp_buffer_t     *tcp_buf,
169*d14abf15SRobert Mustacchi     lm_frag_list_t      *frag_list
170*d14abf15SRobert Mustacchi     );
171*d14abf15SRobert Mustacchi 
172*d14abf15SRobert Mustacchi /** Description
173*d14abf15SRobert Mustacchi  *  Returns data that is buffered in the generic buffers to the mm.
174*d14abf15SRobert Mustacchi  *  after this function completes, and the data is indicated to the client
175*d14abf15SRobert Mustacchi  *  the next function (lm_tcp_rx_buffered_data_indicated) should be called.
176*d14abf15SRobert Mustacchi  * Assumptions:
177*d14abf15SRobert Mustacchi  *  - function is called as a result of a call to mm_tcp_rx_indicate_gen
178*d14abf15SRobert Mustacchi  *  - return_buf_ctx will be sent to lm_tcp_rx_buffered_data_indicated and to l4_buffer_return
179*d14abf15SRobert Mustacchi  * Returns:
180*d14abf15SRobert Mustacchi  * - LM_STATUS_SUCCESS - buffered data succesfully passed to mm
181*d14abf15SRobert Mustacchi  * - LM_STATUS_FAILURE - no more buffered data
182*d14abf15SRobert Mustacchi  */
183*d14abf15SRobert Mustacchi lm_status_t lm_tcp_rx_get_buffered_data(
184*d14abf15SRobert Mustacchi     IN  struct _lm_device_t * pdev,
185*d14abf15SRobert Mustacchi     IN  lm_tcp_state_t      * tcp,
186*d14abf15SRobert Mustacchi     OUT lm_frag_list_t     ** frag_list,
187*d14abf15SRobert Mustacchi     OUT lm_tcp_gen_buf_t   ** gen_buf /* head of indications generic buffer */
188*d14abf15SRobert Mustacchi     );
189*d14abf15SRobert Mustacchi 
190*d14abf15SRobert Mustacchi /** Description
191*d14abf15SRobert Mustacchi  *  Called from the flow of terminate. Returns data that is buffered in the generic buffers
192*d14abf15SRobert Mustacchi  *  with no conditions
193*d14abf15SRobert Mustacchi  * Assumptions:
194*d14abf15SRobert Mustacchi  *  - function is called as a result of a terminate
195*d14abf15SRobert Mustacchi  *  - return_buf_ctx will be sent to l4_buffer_return
196*d14abf15SRobert Mustacchi  */
197*d14abf15SRobert Mustacchi lm_status_t lm_tcp_rx_get_buffered_data_from_terminate (
198*d14abf15SRobert Mustacchi     IN  struct _lm_device_t * pdev,
199*d14abf15SRobert Mustacchi     IN  lm_tcp_state_t      * tcp,
200*d14abf15SRobert Mustacchi     OUT lm_frag_list_t     ** frag_list,
201*d14abf15SRobert Mustacchi     OUT lm_tcp_gen_buf_t   ** gen_buf /* head of indications generic buffer */
202*d14abf15SRobert Mustacchi     );
203*d14abf15SRobert Mustacchi 
204*d14abf15SRobert Mustacchi /** Description
205*d14abf15SRobert Mustacchi  *  Called by the mm to notify the result of the indication
206*d14abf15SRobert Mustacchi  *  accepted_bytes contains the number of bytes that were accepted by the client. This value can
207*d14abf15SRobert Mustacchi  *  be less than the indicated number of bytes. In which case the indication was a partially succesful
208*d14abf15SRobert Mustacchi  *  indication
209*d14abf15SRobert Mustacchi  * Assumption:
210*d14abf15SRobert Mustacchi  *  - This function is called as a result of a call to mm_tcp_rx_indicate_gen call
211*d14abf15SRobert Mustacchi  *    and only after lm_tcp_rx_get_buffered_data was called.
212*d14abf15SRobert Mustacchi  *  - return_buf_ctx is the buffer returned to lm_tcp_rx_get_buffered_data
213*d14abf15SRobert Mustacchi  *  - accepted_bytes <= indicated number of bytes
214*d14abf15SRobert Mustacchi  */
215*d14abf15SRobert Mustacchi void lm_tcp_rx_buffered_data_indicated(
216*d14abf15SRobert Mustacchi     struct _lm_device_t * pdev,
217*d14abf15SRobert Mustacchi     lm_tcp_state_t      * tcp,
218*d14abf15SRobert Mustacchi     u32_t                 accepted_bytes,
219*d14abf15SRobert Mustacchi     lm_tcp_gen_buf_t    * gen_buf /* head of indications generic buffer */
220*d14abf15SRobert Mustacchi     );
221*d14abf15SRobert Mustacchi 
222*d14abf15SRobert Mustacchi /** Description
223*d14abf15SRobert Mustacchi  *  If connection is still open updates the sws, updates the pending return indications
224*d14abf15SRobert Mustacchi  */
225*d14abf15SRobert Mustacchi void lm_tcp_rx_indication_returned(
226*d14abf15SRobert Mustacchi     struct _lm_device_t * pdev,
227*d14abf15SRobert Mustacchi     lm_tcp_state_t      * tcp,
228*d14abf15SRobert Mustacchi     lm_tcp_gen_buf_t    * gen_buf/* head of indications generic buffer */
229*d14abf15SRobert Mustacchi     );
230*d14abf15SRobert Mustacchi 
231*d14abf15SRobert Mustacchi /** Description
232*d14abf15SRobert Mustacchi  *  Called:
233*d14abf15SRobert Mustacchi  *   1. when a buffer is returned from a client and the connection is already closed
234*d14abf15SRobert Mustacchi  *   2. when upload_completion returns from the client
235*d14abf15SRobert Mustacchi  *  Checks if the connection is dead and can be deleted (depending on state,
236*d14abf15SRobert Mustacchi  *  and pending return indications)
237*d14abf15SRobert Mustacchi  *  If the call is due to (2), changes the state to UPLOAD_DONE
238*d14abf15SRobert Mustacchi  *  3. when offload completion is proceesed and we service deferred cqes,
239*d14abf15SRobert Mustacchi  *  its possible that the connection was uploaded while waiting to the offload completion
240*d14abf15SRobert Mustacchi  * Assumptions:
241*d14abf15SRobert Mustacchi  *  SP and Rx locks are taken by the caller
242*d14abf15SRobert Mustacchi  * Return:
243*d14abf15SRobert Mustacchi  *  TRUE  - if connection can be deleted  i.e. state = UPLOAD_DONE,
244*d14abf15SRobert Mustacchi  *          and all pending indications returned
245*d14abf15SRobert Mustacchi  *  FALSE - o/w
246*d14abf15SRobert Mustacchi  */
247*d14abf15SRobert Mustacchi u8_t lm_tcp_is_tcp_dead(
248*d14abf15SRobert Mustacchi     struct _lm_device_t * pdev,
249*d14abf15SRobert Mustacchi     lm_tcp_state_t      * tcp,
250*d14abf15SRobert Mustacchi     u8_t                  op
251*d14abf15SRobert Mustacchi     );
252*d14abf15SRobert Mustacchi #define TCP_IS_DEAD_OP_RTRN_BUFS         (0)
253*d14abf15SRobert Mustacchi #define TCP_IS_DEAD_OP_UPLD_COMP         (1)
254*d14abf15SRobert Mustacchi #define TCP_IS_DEAD_OP_OFLD_COMP_DFRD    (2)
255*d14abf15SRobert Mustacchi 
256*d14abf15SRobert Mustacchi /** Description
257*d14abf15SRobert Mustacchi  *  checks the state of the connection (POST_BLOCKED or NOT)
258*d14abf15SRobert Mustacchi  * Returns
259*d14abf15SRobert Mustacchi  *  SUCCESS           - if connection is open
260*d14abf15SRobert Mustacchi  *  CONNECTION_CLOSED - if connection is blocked
261*d14abf15SRobert Mustacchi  */
262*d14abf15SRobert Mustacchi lm_status_t lm_tcp_con_status(
263*d14abf15SRobert Mustacchi     struct _lm_device_t * pdev,
264*d14abf15SRobert Mustacchi     lm_tcp_con_t        * rx_con);
265*d14abf15SRobert Mustacchi 
266*d14abf15SRobert Mustacchi /** Description
267*d14abf15SRobert Mustacchi  *  calculates the size of a generic buffer based on min_gen_buf_size and mtu
268*d14abf15SRobert Mustacchi  *  this function should be called at init, it does not initialize the lm
269*d14abf15SRobert Mustacchi  *  toe_info parameter
270*d14abf15SRobert Mustacchi  * Assumptions:
271*d14abf15SRobert Mustacchi  *  mtu and min_gen_buf_size are initialized
272*d14abf15SRobert Mustacchi  * Returns:
273*d14abf15SRobert Mustacchi  *  size of generic buffer
274*d14abf15SRobert Mustacchi  */
275*d14abf15SRobert Mustacchi u32_t lm_tcp_calc_gen_buf_size(struct _lm_device_t * pdev);
276*d14abf15SRobert Mustacchi 
277*d14abf15SRobert Mustacchi /** Description
278*d14abf15SRobert Mustacchi  * extracts the size of a generic buffer from the lmdev
279*d14abf15SRobert Mustacchi  */
280*d14abf15SRobert Mustacchi #define LM_TCP_GEN_BUF_SIZE(lmdev) ((lmdev)->toe_info.gen_buf_size)
281*d14abf15SRobert Mustacchi 
282*d14abf15SRobert Mustacchi u8_t lm_toe_is_tx_completion(struct _lm_device_t *pdev, u8_t drv_toe_rss_id);
283*d14abf15SRobert Mustacchi u8_t lm_toe_is_rx_completion(struct _lm_device_t *pdev, u8_t drv_toe_rss_id);
284*d14abf15SRobert Mustacchi u8_t lm_toe_is_rcq_suspended(struct _lm_device_t *pdev, u8_t drv_toe_rss_id);
285*d14abf15SRobert Mustacchi void lm_toe_service_tx_intr(struct _lm_device_t *pdev, u8_t drv_toe_rss_id);
286*d14abf15SRobert Mustacchi void lm_toe_service_rx_intr(struct _lm_device_t *pdev, u8_t drv_toe_rss_id);
287*d14abf15SRobert Mustacchi void lm_tcp_clear_grqs(struct _lm_device_t * lmdev);
288*d14abf15SRobert Mustacchi 
289*d14abf15SRobert Mustacchi /*********************** TOE RSS ******************************/
290*d14abf15SRobert Mustacchi /**
291*d14abf15SRobert Mustacchi  * @Description: Update TOE RSS. The origin of this call is when getting
292*d14abf15SRobert Mustacchi  *               an OS RSS update. It's actually by L2 interface and not
293*d14abf15SRobert Mustacchi  *               L4. However, the ramrods are separate for L4 + L2 due to the
294*d14abf15SRobert Mustacchi  *               assumptions by the different protocols of what the data is
295*d14abf15SRobert Mustacchi  *               in the indirection table.
296*d14abf15SRobert Mustacchi  *
297*d14abf15SRobert Mustacchi  * @Assumptions: Called BEFORE calling L2
298*d14abf15SRobert Mustacchi  *                 enable-rss!!
299*d14abf15SRobert Mustacchi  *
300*d14abf15SRobert Mustacchi  * @param pdev
301*d14abf15SRobert Mustacchi  * @param chain_indirection_table - table of TOE RCQ chain values
302*d14abf15SRobert Mustacchi  * @param table_size    - size of table above
303*d14abf15SRobert Mustacchi  * @param enable    - is this enable/disable rss if it's disable, the
304*d14abf15SRobert Mustacchi  *                    table will all point to the same entry
305*d14abf15SRobert Mustacchi  *
306*d14abf15SRobert Mustacchi  * @return lm_status_t - PENDING is completion will arrive asyncrounoulsy
307*d14abf15SRobert Mustacchi  *                     - SUCCESS if no ramrod is sent (for example table didn't change)
308*d14abf15SRobert Mustacchi  *                     - FAILURE o/w
309*d14abf15SRobert Mustacchi  */
310*d14abf15SRobert Mustacchi lm_status_t lm_tcp_update_rss(struct _lm_device_t * pdev, u8_t * chain_indirection_table,
311*d14abf15SRobert Mustacchi                               u32_t table_size, u8_t  enable);
312*d14abf15SRobert Mustacchi 
313*d14abf15SRobert Mustacchi 
314*d14abf15SRobert Mustacchi /* This functions sets the update window mode. We work in two modes:
315*d14abf15SRobert Mustacchi  * SHORT_LOOP and LONG_LOOP.
316*d14abf15SRobert Mustacchi  * SHORT_LOOP: if generic indication succeeded, the window is update immediately by the accepted bytes
317*d14abf15SRobert Mustacchi  * LONG_LOOP: if generic indication succeeded, the window is updated only when the buffer is returned via l4_return_buffer
318*d14abf15SRobert Mustacchi  */
319*d14abf15SRobert Mustacchi #define LM_TCP_SET_UPDATE_WINDOW_MODE(lmdev, mode) (lmdev)->toe_info.update_window_mode = mode
320*d14abf15SRobert Mustacchi 
321*d14abf15SRobert Mustacchi #define LM_TCP_GET_UPDATE_WINDOW_MODE(lmdev) ((lmdev)->toe_info.update_window_mode)
322*d14abf15SRobert Mustacchi 
323*d14abf15SRobert Mustacchi 
324*d14abf15SRobert Mustacchi 
325*d14abf15SRobert Mustacchi /**
326*d14abf15SRobert Mustacchi  * Description:
327*d14abf15SRobert Mustacchi  *  - Post a fin request BD in the bd chain
328*d14abf15SRobert Mustacchi  * Returns:
329*d14abf15SRobert Mustacchi  *  - SUCCESS - fin request was posted on the BD chain
330*d14abf15SRobert Mustacchi  *  - CONNECTION CLOSED- as described in lm_tcp_tx_post_buf()
331*d14abf15SRobert Mustacchi  */
332*d14abf15SRobert Mustacchi lm_status_t lm_tcp_graceful_disconnect(
333*d14abf15SRobert Mustacchi     IN struct _lm_device_t          * pdev,     /* device handle */
334*d14abf15SRobert Mustacchi     IN lm_tcp_state_t               * tcp_state /* L4 state */
335*d14abf15SRobert Mustacchi );
336*d14abf15SRobert Mustacchi 
337*d14abf15SRobert Mustacchi /** Description
338*d14abf15SRobert Mustacchi  *  check if there is a pending remote disconnect on the rx connection.
339*d14abf15SRobert Mustacchi  *  This function is called from the um, after buffers have been posted. If there is a
340*d14abf15SRobert Mustacchi  *  remote disconnect pending, it will be processed.
341*d14abf15SRobert Mustacchi  */
lm_tcp_rx_is_remote_disconnect_pending(lm_tcp_state_t * tcp_state)342*d14abf15SRobert Mustacchi __inline static u8_t lm_tcp_rx_is_remote_disconnect_pending(lm_tcp_state_t * tcp_state)
343*d14abf15SRobert Mustacchi {
344*d14abf15SRobert Mustacchi     lm_tcp_con_t             * rx_con   = tcp_state->rx_con;
345*d14abf15SRobert Mustacchi     lm_tcp_con_rx_gen_info_t * gen_info = &rx_con->u.rx.gen_info;
346*d14abf15SRobert Mustacchi 
347*d14abf15SRobert Mustacchi     return (u8_t)(!(rx_con->flags & TCP_RX_POST_BLOCKED) &&
348*d14abf15SRobert Mustacchi             (gen_info->peninsula_nbytes == 0)      &&
349*d14abf15SRobert Mustacchi             (rx_con->u.rx.flags & (TCP_CON_FIN_IND_PENDING | TCP_CON_RST_IND_PENDING)));
350*d14abf15SRobert Mustacchi 
351*d14abf15SRobert Mustacchi }
352*d14abf15SRobert Mustacchi 
353*d14abf15SRobert Mustacchi /** Description
354*d14abf15SRobert Mustacchi  *  checks whether it is OK to update the tcp state. We only update if the connection
355*d14abf15SRobert Mustacchi  *  is not being offload/uploaded/invalidated i.e. normal or aborted.
356*d14abf15SRobert Mustacchi  */
lm_tcp_ok_to_update(lm_tcp_state_t * tcp)357*d14abf15SRobert Mustacchi __inline static u8_t lm_tcp_ok_to_update(lm_tcp_state_t * tcp)
358*d14abf15SRobert Mustacchi {
359*d14abf15SRobert Mustacchi     /* a state status is changed to invalidate only after the invalidate is completed, therefore
360*d14abf15SRobert Mustacchi      * to make sure a state isn't in the process of being invalidated we check it's flags to see
361*d14abf15SRobert Mustacchi      * whether an invalidate request has already been posted. */
362*d14abf15SRobert Mustacchi     return (u8_t)(((tcp->hdr.status == STATE_STATUS_NORMAL) ||
363*d14abf15SRobert Mustacchi             (tcp->hdr.status == STATE_STATUS_ABORTED)) &&
364*d14abf15SRobert Mustacchi             !(tcp->rx_con->flags & TCP_INV_REQ_POSTED));
365*d14abf15SRobert Mustacchi }
366*d14abf15SRobert Mustacchi 
367*d14abf15SRobert Mustacchi /**
368*d14abf15SRobert Mustacchi  * Description:
369*d14abf15SRobert Mustacchi  *     initializes the lm data in a slow path request given the request parameters
370*d14abf15SRobert Mustacchi  */
371*d14abf15SRobert Mustacchi void lm_init_sp_req_type (
372*d14abf15SRobert Mustacchi     struct _lm_device_t        * pdev,
373*d14abf15SRobert Mustacchi     lm_tcp_state_t             * tcp,
374*d14abf15SRobert Mustacchi     lm_tcp_slow_path_request_t * lm_req,
375*d14abf15SRobert Mustacchi     void                       * req_input_data);
376*d14abf15SRobert Mustacchi 
377*d14abf15SRobert Mustacchi /**
378*d14abf15SRobert Mustacchi  * Description (for following two functions)
379*d14abf15SRobert Mustacchi  *     finds the next tcp states dependent of the path/neigh
380*d14abf15SRobert Mustacchi  *     given the previous tcp state. If tcp_state is NULL, it
381*d14abf15SRobert Mustacchi  *     returns the first such tcp_state
382*d14abf15SRobert Mustacchi  * Returns
383*d14abf15SRobert Mustacchi  *     tcp_state: if such exists
384*d14abf15SRobert Mustacchi  *     NULL: if there are no more tcp states dependent of the
385*d14abf15SRobert Mustacchi  *     given path/neigh
386*d14abf15SRobert Mustacchi  */
387*d14abf15SRobert Mustacchi lm_tcp_state_t * lm_tcp_get_next_path_dependent(
388*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
389*d14abf15SRobert Mustacchi     void   *path_state,
390*d14abf15SRobert Mustacchi     lm_tcp_state_t * tcp_state);
391*d14abf15SRobert Mustacchi 
392*d14abf15SRobert Mustacchi lm_tcp_state_t * lm_tcp_get_next_neigh_dependent(
393*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
394*d14abf15SRobert Mustacchi     void   * neigh_state,
395*d14abf15SRobert Mustacchi     lm_tcp_state_t * tcp_state);
396*d14abf15SRobert Mustacchi 
397*d14abf15SRobert Mustacchi 
398*d14abf15SRobert Mustacchi /**
399*d14abf15SRobert Mustacchi  * Description
400*d14abf15SRobert Mustacchi  *     finds the next neigh state following by given the
401*d14abf15SRobert Mustacchi  *     previous neigh_state. If neigh_state is NULL, it returns
402*d14abf15SRobert Mustacchi  *     the first neigh_state in list of neigh states
403*d14abf15SRobert Mustacchi  * Returns
404*d14abf15SRobert Mustacchi  *     neigh_state: if exists
405*d14abf15SRobert Mustacchi  *     NULL: if neigh list is empty or no more neigh states in
406*d14abf15SRobert Mustacchi  *     the list
407*d14abf15SRobert Mustacchi  */
408*d14abf15SRobert Mustacchi lm_neigh_state_t * lm_tcp_get_next_neigh(
409*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
410*d14abf15SRobert Mustacchi     lm_neigh_state_t * neigh_state);
411*d14abf15SRobert Mustacchi 
412*d14abf15SRobert Mustacchi /**
413*d14abf15SRobert Mustacchi  * Description
414*d14abf15SRobert Mustacchi  *     finds the next path states matched non NULL neigh
415*d14abf15SRobert Mustacchi  *     If neigh_state is NULL, it returns the next path state in
416*d14abf15SRobert Mustacchi  *     list of path states
417*d14abf15SRobert Mustacchi  * Returns
418*d14abf15SRobert Mustacchi  *     path_state: if such exists
419*d14abf15SRobert Mustacchi  *     NULL: if there are no more path states dependent of the
420*d14abf15SRobert Mustacchi  *     given neigh (in not NULL)
421*d14abf15SRobert Mustacchi  */
422*d14abf15SRobert Mustacchi lm_path_state_t * lm_tcp_get_next_path(
423*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
424*d14abf15SRobert Mustacchi     lm_neigh_state_t * neigh_state,
425*d14abf15SRobert Mustacchi     lm_path_state_t * path_state);
426*d14abf15SRobert Mustacchi 
427*d14abf15SRobert Mustacchi /**
428*d14abf15SRobert Mustacchi  * Description
429*d14abf15SRobert Mustacchi  *     finds the next tcp states in list of tcp
430*d14abf15SRobert Mustacchi  *
431*d14abf15SRobert Mustacchi  * Returns
432*d14abf15SRobert Mustacchi  *     tcp_state: if such exists
433*d14abf15SRobert Mustacchi  *     NULL: if there are no more tcp states in the list
434*d14abf15SRobert Mustacchi  */
435*d14abf15SRobert Mustacchi 
436*d14abf15SRobert Mustacchi lm_tcp_state_t * lm_tcp_get_next_tcp(
437*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
438*d14abf15SRobert Mustacchi     lm_tcp_state_t * tcp_state);
439*d14abf15SRobert Mustacchi 
440*d14abf15SRobert Mustacchi /* GilR 8/22/2006 - TBD - temp implementation, for debugging. to be removed?/wrapped with "#if DBG"? */
441*d14abf15SRobert Mustacchi void lm_tcp_internal_query(
442*d14abf15SRobert Mustacchi     IN    struct _lm_device_t * pdev);
443*d14abf15SRobert Mustacchi 
444*d14abf15SRobert Mustacchi /**
445*d14abf15SRobert Mustacchi  * Returns the number of entries needed in frag list
446*d14abf15SRobert Mustacchi  * taking into an account the CWnd and MSS
447*d14abf15SRobert Mustacchi  */
448*d14abf15SRobert Mustacchi u32_t lm_tcp_calc_frag_cnt(
449*d14abf15SRobert Mustacchi     struct _lm_device_t * pdev,
450*d14abf15SRobert Mustacchi     lm_tcp_state_t * tcp
451*d14abf15SRobert Mustacchi     );
452*d14abf15SRobert Mustacchi 
453*d14abf15SRobert Mustacchi /** Description
454*d14abf15SRobert Mustacchi  *  function is called whenever the UM allocates more generic buffers
455*d14abf15SRobert Mustacchi  */
456*d14abf15SRobert Mustacchi void lm_tcp_rx_gen_bufs_alloc_cb(
457*d14abf15SRobert Mustacchi     struct _lm_device_t * pdev);
458*d14abf15SRobert Mustacchi 
459*d14abf15SRobert Mustacchi /** Description
460*d14abf15SRobert Mustacchi  *  Callback function for cids being recylced
461*d14abf15SRobert Mustacchi  */
462*d14abf15SRobert Mustacchi void lm_tcp_recycle_cid_cb(
463*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
464*d14abf15SRobert Mustacchi     void *cookie,
465*d14abf15SRobert Mustacchi     s32_t cid);
466*d14abf15SRobert Mustacchi 
467*d14abf15SRobert Mustacchi void lm_tcp_init_num_of_blocks_per_connection(
468*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev,
469*d14abf15SRobert Mustacchi     u8_t    num);
470*d14abf15SRobert Mustacchi 
471*d14abf15SRobert Mustacchi u8_t lm_tcp_get_num_of_blocks_per_connection(
472*d14abf15SRobert Mustacchi     struct _lm_device_t *pdev);
473*d14abf15SRobert Mustacchi 
474*d14abf15SRobert Mustacchi lm_status_t lm_tcp_erase_connection(
475*d14abf15SRobert Mustacchi     IN    struct _lm_device_t   * pdev,
476*d14abf15SRobert Mustacchi     IN    lm_tcp_state_t        * tcp);
477*d14abf15SRobert Mustacchi 
478*d14abf15SRobert Mustacchi u8_t lm_tcp_get_src_ip_cam_byte(
479*d14abf15SRobert Mustacchi     IN    struct _lm_device_t   * pdev,
480*d14abf15SRobert Mustacchi     IN    lm_path_state_t        * path);
481*d14abf15SRobert Mustacchi 
482*d14abf15SRobert Mustacchi lm_tcp_state_t* lm_tcp_find_offloaded_tcp_tuple(struct _lm_device_t   * pdev, u8_t src_ip_byte, u8_t src_tcp_b, u8_t dst_tcp_b, lm_tcp_state_t * prev_tcp);
483*d14abf15SRobert Mustacchi 
484*d14abf15SRobert Mustacchi 
485*d14abf15SRobert Mustacchi void lm_tcp_rx_clear_isles(struct _lm_device_t * pdev, lm_tcp_state_t * tcp_state, d_list_t * isles_list);
486*d14abf15SRobert Mustacchi 
487*d14abf15SRobert Mustacchi u8_t * lm_tcp_get_pattern(struct _lm_device_t *,
488*d14abf15SRobert Mustacchi                           lm_tcp_state_t * tcp,
489*d14abf15SRobert Mustacchi                           u8_t  pattern_idx,
490*d14abf15SRobert Mustacchi                           u32_t offset,
491*d14abf15SRobert Mustacchi                           u32_t * pattern_size);
492*d14abf15SRobert Mustacchi 
493*d14abf15SRobert Mustacchi void lm_tcp_set_pattern_offset(struct _lm_device_t * pdev,
494*d14abf15SRobert Mustacchi                           lm_tcp_state_t * tcp,
495*d14abf15SRobert Mustacchi                           u8_t  pattern_idx,
496*d14abf15SRobert Mustacchi                           u32_t offset);
497*d14abf15SRobert Mustacchi 
498*d14abf15SRobert Mustacchi u32_t lm_tcp_find_pattern_offset(struct _lm_device_t * pdev, u8_t * sub_buf, u32_t sub_buf_size);
499*d14abf15SRobert Mustacchi 
500*d14abf15SRobert Mustacchi #endif /* _LM_L4IF_H */
501