lm_l4fp.h revision d14abf155341d55053c76eeec58b787a456b753b
/*******************************************************************************
* lm_l4fp.h - l4 common fast path interface
*******************************************************************************/
#ifndef _LM_L4FP_H
#define _LM_L4FP_H
/* Maximum size of the SGE BD may point at */
#define TCP_MAX_SGE_SIZE 0xffff /* 64KB */
/* Maximum size of the SGL */
#define TCP_MAX_SGL_SIZE 0xffff /* 64KB - bd_used field is u16_t */
/* Assumptions: Called only from DPC flow OR deferred cqes. Holds the fp-lock */
void lm_tcp_complete_bufs(
struct _lm_device_t *pdev,
lm_tcp_state_t *tcp,
lm_tcp_con_t *con);
/* Assumptions: Called only from DPC flow OR deferred cqes. Does not hold the fp-lock */
u32_t lm_tcp_complete_nbytes(
struct _lm_device_t *pdev,
lm_tcp_state_t *tcp,
lm_tcp_con_t *con, /* Rx OR Tx connection */
u32_t completed_bytes, /* num bytes completed (might be 0) */
u8_t push /* if == 0, don't complete partialy
completed buffers towards mm */);
/**
* Description:
* Aborts the pending buffers on the given connection :
* immediately completes them with the given status.
*/
void lm_tcp_abort_bufs(
struct _lm_device_t * pdev, /* device handle */
lm_tcp_state_t * tcp, /* L4 state */
lm_tcp_con_t * con, /* L4 connection to abort buffers on */
lm_status_t stat /* status to abort with */
);
/******** qe_buffer interface: cyclic NO-OVERRIDE buffer ****************/
/** Description
* returns the next cqe in the cqe_buffer and updates the buffer params
* (head)
*/
char * lm_tcp_qe_buffer_next_free_cqe(lm_tcp_qe_buffer_t * cqe_buffer);
/** Description
* returns the next occupied cqe in the cqe_buffer and updates the buffer params
* (tail)
*/
char * lm_tcp_qe_buffer_next_occupied_cqe(lm_tcp_qe_buffer_t * cqe_buffer);
/** Description
* returns whether the buffer is empty or not (head == tail)
*/
u8_t lm_tcp_qe_buffer_is_empty(lm_tcp_qe_buffer_t * cqe_buffer);
/******** qe_buffer interface: cyclic OVERRIDE buffer ****************/
/** Description
* returns the next head location in a cyclic manner. This is an override
* function, meaning that the returned head could be overriding a previous
* written cqe
*/
char * lm_tcp_qe_buffer_next_cqe_override(lm_tcp_qe_buffer_t * cqe_buffer);
/** Description
* processes a single rx cqe
* called as a result of deferred cqes
*/
void lm_tcp_rx_process_cqe(
lm_device_t * pdev,
struct toe_rx_cqe * cqe,
lm_tcp_state_t * tcp,
u8_t sb_idx
);
/** Description
* processes a single tx cqe
* called as a result of deferred cqes
*/
void lm_tcp_tx_process_cqe(
lm_device_t * pdev,
struct toe_tx_cqe * cqe,
lm_tcp_state_t * tcp
);
void lm_tcp_rx_complete_tcp_fp(
lm_device_t * pdev,
lm_tcp_state_t * tcp,
lm_tcp_con_t * con
);
void lm_tcp_tx_complete_tcp_fp(
lm_device_t * pdev,
lm_tcp_state_t * tcp,
lm_tcp_con_t * con
);
/** Description
* adds another nbytes to the sws counter, and posts a doorbell if we're
* above a certain threshold
* assumptions : caller took the rx-lock
*/
void lm_tcp_rx_post_sws (
lm_device_t * pdev,
lm_tcp_state_t * tcp,
lm_tcp_con_t * rx_con,
u32_t nbytes,
u8_t op /* Increase / Decrease */
);
#define TCP_RX_POST_SWS_INC 0
#define TCP_RX_POST_SWS_DEC 1
#define TCP_RX_POST_SWS_SET 2
/** Description
* while we are in a DPC, we don't pop buffers from the active_tb_list, this function
* helps in determining the next buffer in the active tb list that is valid (i.e. the
* head of active_tb_list had we popped buffers)
*/
static __inline lm_tcp_buffer_t * lm_tcp_next_entry_dpc_active_list(lm_tcp_con_t * con)
{
if (con->dpc_info.dpc_completed_tail) {
return (lm_tcp_buffer_t *)s_list_next_entry(con->dpc_info.dpc_completed_tail);
} else {
return (lm_tcp_buffer_t *)s_list_peek_head(&con->active_tb_list);
}
}
#endif /* _LM_L4FP_H */