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