d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "lm5710.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "lm.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "lm_l4sp.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "command.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "context.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "bd_chain.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "mm.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "mm_l4if.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "lm_l4fp.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "lm_l4sp.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "everest_l5cm_constants.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "l4debug.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Sizes of objects that need to be allocated in physical memory */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define TOE_SP_PHYS_DATA_SIZE ((sizeof(lm_tcp_slow_path_phys_data_t) + CACHE_LINE_SIZE_MASK) & ~CACHE_LINE_SIZE_MASK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define TOE_DB_RX_DATA_SIZE ((sizeof(struct toe_rx_db_data) + CACHE_LINE_SIZE_MASK) & ~CACHE_LINE_SIZE_MASK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define TOE_DB_TX_DATA_SIZE ((sizeof(struct toe_tx_db_data) + CACHE_LINE_SIZE_MASK) & ~CACHE_LINE_SIZE_MASK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define TCP_XCM_DEFAULT_DEL_ACK_MAX_CNT 2
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchil4_tcp_con_state_t lm_tcp_calc_state (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t fin_was_sent
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/** Description Callback function for spe being completed
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * internally in vbd driver (not via FW)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_comp_cb(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct sq_pending_command *pending);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* GilR 11/13/2006 - TODO - ttl is temporarily overloaded for ethearel capture L4/L2 debugging */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define TOE_DBG_TTL 200
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define ISCSI_DBG_TTL 222
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define TIMERS_TICKS_PER_SEC (u32_t)(1000)//(1 / TIMERS_TICK_SIZE_CHIP)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define TSEMI_CLK1_TICKS_PER_SEC (u32_t)(1000)//(1 / TSEMI_CLK1_RESUL_CHIP)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t lm_get_num_of_cashed_grq_bds(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return USTORM_TOE_GRQ_CACHE_NUM_BDS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// this function is used only to verify that the defines above are correct (on compile time - save the runtime checkings...)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _fake_func_verify_defines(void)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC( TIMERS_TICKS_PER_SEC == (1 / TIMERS_TICK_SIZE_CHIP) ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC( TSEMI_CLK1_TICKS_PER_SEC == (1 / TSEMI_CLK1_RESUL_CHIP) ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic __inline u32_t lm_time_resolution(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t src_time,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t src_ticks_per_sec,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t trg_ticks_per_sec)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u64_t result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u64_t tmp_result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t dev_factor;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(src_ticks_per_sec && trg_ticks_per_sec));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (trg_ticks_per_sec > src_ticks_per_sec){
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dev_factor = trg_ticks_per_sec / src_ticks_per_sec;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = src_time * dev_factor;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tmp_result = src_time * trg_ticks_per_sec;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if defined(_VBD_)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = CEIL_DIV(tmp_result, src_ticks_per_sec);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Here we try a avoid 64-bit division operation */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tmp_result < 0xffffffff) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = (u32_t)tmp_result / src_ticks_per_sec;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* src_ticks_per_sec and trg_ticks_per_sec parameters come
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi from NDIS and so far the values observed were 100 or 1000,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi depending on Windows version. These parameters define
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi TCP timers resolution and are unlikely to change significantly
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi in the future.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi So, here we assume that if (src_time * trg_ticks_per_sec) product
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi is out of 32-bit range it is because src_time value.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(src_time < src_ticks_per_sec);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = ((u64_t)(src_time / src_ticks_per_sec)) * trg_ticks_per_sec;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(src_time && !result) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "lm_time_resulition: src_time=%d, src_ticks_per_sec=%d, trg_ticks_per_sec=%d, result=%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi src_time, src_ticks_per_sec, trg_ticks_per_sec, result);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(result > 0xffffffff);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (u32_t)result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_erase_connection(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t *rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t *tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!lm_fl_reset_is_inprogress(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "##lm_tcp_erase_connection(0x%x)\n",tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->flags |= TCP_POST_BLOCKED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_abort_bufs(pdev, tcp, tx_con, LM_STATUS_CONNECTION_CLOSED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tx_con->abortion_under_flr) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "##lm_tcp_erase_connection(0x%x): Tx aborted\n",tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Rx abortive part... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Abort pending buffers */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->flags |= TCP_POST_BLOCKED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (mm_tcp_indicating_bufs(rx_con)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "##lm_tcp_erase_connection(0x%x): under indication\n",tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_abort_bufs(pdev, tcp, rx_con, LM_STATUS_CONNECTION_CLOSED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (rx_con->abortion_under_flr) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "##lm_tcp_erase_connection(0x%x): Rx aborted\n",tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_del_tcp_state(pdev,tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_flush_db(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_tx_doorbell dq_flush_msg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t *rx_con, *tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(pdev && tcp));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type != TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4sp, "##lm_tcp_flush_db is not sent for connection(0x%x) of type %d\n",tcp->cid, tcp->ulp_type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "##lm_tcp_flush_db (cid=0x%x)\n",tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dq_flush_msg.hdr.data = (TOE_CONNECTION_TYPE << DOORBELL_HDR_T_CONN_TYPE_SHIFT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dq_flush_msg.params = TOE_TX_DOORBELL_FLUSH;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dq_flush_msg.nbytes = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->flags |= TCP_DB_BLOCKED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->flags |= TCP_DB_BLOCKED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DOORBELL(pdev, tcp->cid, *((u32_t *)&dq_flush_msg));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * allocate l4 resources
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - lm_init_params was already called
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_alloc_resc(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_toe_info_t *toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t *bd_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi long i;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t mm_cli_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "##lm_tcp_alloc_resc\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // NOP, call this function only to prevent compile warning.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _fake_func_verify_defines();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx = LM_RESOURCE_NDIS;//!!DP mm_cli_idx_to_um_idx(LM_CLI_IDX_NDIS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info = &pdev->toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FOREACH_TSS_IDX(pdev, i)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* allocate SCQs */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &toe_info->scqs[i].bd_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = pdev->params.l4_scq_page_cnt * LM_PAGE_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->bd_chain_virt = mm_alloc_phys_mem(pdev, mem_size, &bd_chain->bd_chain_phy, 0, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!bd_chain->bd_chain_virt) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(bd_chain->bd_chain_virt, 0, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FOREACH_RSS_IDX(pdev, i)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* allocate RCQs */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &toe_info->rcqs[i].bd_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = pdev->params.l4_rcq_page_cnt * LM_PAGE_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->bd_chain_virt = mm_alloc_phys_mem(pdev, mem_size, &bd_chain->bd_chain_phy, 0, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!bd_chain->bd_chain_virt) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(bd_chain->bd_chain_virt, 0, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* allocate GRQs */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &toe_info->grqs[i].bd_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = pdev->params.l4_grq_page_cnt * LM_PAGE_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->bd_chain_virt = mm_alloc_phys_mem(pdev, mem_size, &bd_chain->bd_chain_phy, 0, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!bd_chain->bd_chain_virt) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(bd_chain->bd_chain_virt, 0, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(toe_info->grqs[i].isles_pool);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pdev->params.l4_isles_pool_size) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.l4_isles_pool_size = 2 * T_TCP_ISLE_ARRAY_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if (pdev->params.l4_isles_pool_size < T_TCP_ISLE_ARRAY_SIZE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.l4_isles_pool_size = T_TCP_ISLE_ARRAY_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = pdev->params.l4_isles_pool_size * sizeof(lm_isle_t);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info->grqs[i].isles_pool = (lm_isle_t*)mm_alloc_mem(pdev, mem_size, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!toe_info->grqs[i].isles_pool) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(toe_info->grqs[i].isles_pool, 0, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_data_integrity) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t pb_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.integrity_info.pattern_size = 256;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.integrity_info.pattern_buf_size = 0x10000 + pdev->toe_info.integrity_info.pattern_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.integrity_info.pattern_buf = mm_alloc_mem(pdev, pdev->toe_info.integrity_info.pattern_buf_size, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pdev->toe_info.integrity_info.pattern_buf) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (pb_idx = 0; pb_idx < pdev->toe_info.integrity_info.pattern_buf_size; pb_idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.integrity_info.pattern_buf[pb_idx] = pb_idx % pdev->toe_info.integrity_info.pattern_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Allocate rss-update physical data */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.rss_update_data = (struct toe_rss_update_ramrod_data *)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_alloc_phys_mem(pdev, sizeof(*pdev->toe_info.rss_update_data),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->toe_info.rss_update_data_phys,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0,0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->toe_info.rss_update_data == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_get_default_l4cli_params(lm_device_t *pdev, l4_ofld_params_t *l4_params)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_params_t *def_params = &pdev->params;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(def_params->l4cli_ack_frequency > 0xff);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_params->ack_frequency = def_params->l4cli_ack_frequency & 0xff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(def_params->l4cli_delayed_ack_ticks > 0xff);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_params->delayed_ack_ticks = def_params->l4cli_delayed_ack_ticks & 0xff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(def_params->l4cli_doubt_reachability_retx > 0xff);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_params->doubt_reachability_retx = def_params->l4cli_doubt_reachability_retx & 0xff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_params->dup_ack_threshold = def_params->l4cli_dup_ack_threshold;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((def_params->l4cli_flags != 0) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (def_params->l4cli_flags != OFLD_PARAM_FLAG_SNAP_ENCAP));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_params->flags = def_params->l4cli_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(def_params->l4cli_max_retx > 0xff);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_params->max_retx = def_params->l4cli_max_retx & 0xff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_params->nce_stale_ticks = def_params->l4cli_nce_stale_ticks;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_params->push_ticks = def_params->l4cli_push_ticks;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(def_params->l4cli_starting_ip_id > 0xffff);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_params->starting_ip_id = def_params->l4cli_starting_ip_id & 0xffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_params->sws_prevention_ticks = def_params->l4cli_sws_prevention_ticks;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_params->ticks_per_second = def_params->l4cli_ticks_per_second;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/** Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * requests generic buffers from the generic buffer pool and attaches the generic buffers
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to the grq-bd chain. It attaches the amount of buffers received, no matter if they were
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * less than requested. Function always tries to fill bd-chain (i.e. requests bd_chain->bd_left)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - called after the generic buffer pool is ready to deliver generic buffers
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - who ever will call this function will handle checking if a work item for allocating more
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * buffers is needed.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - TRUE: buffers were written
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - FALSE: o/w
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_tcp_rx_fill_grq(struct _lm_device_t * pdev, u8_t sb_idx, d_list_t * bypass_gen_pool_list, u8_t filling_mode)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_toe_info_t * toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_grq_t * grq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_rx_grq_bd * grq_bd;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_gen_buf_t * curr_gen_buf;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t * bd_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_t tmp_gen_buf_list;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_t free_gen_buf_list;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t num_bufs; /* limited by bd_chain->bd_left */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t num_bufs_threshold;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t num_bypass_buffs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t avg_dpc_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info = &pdev->toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq = &toe_info->grqs[sb_idx];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &grq->bd_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_bufs = bd_chain->bd_left; /* required number of bufs from grq pool */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4rx, "###lm_tcp_rx_fill_grq bd_left (to be filled)= %d\n", bd_chain->bd_left);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pdev->params.l4_grq_filling_threshold_divider) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_bufs_threshold = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_grq_filling_threshold_divider < 2) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.l4_grq_filling_threshold_divider = 2;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_bufs_threshold = bd_chain->capacity / pdev->params.l4_grq_filling_threshold_divider;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_init(&tmp_gen_buf_list, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_init(&free_gen_buf_list, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (bypass_gen_pool_list != NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_bypass_buffs = d_list_entry_cnt(bypass_gen_pool_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_bypass_buffs = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (filling_mode == FILL_GRQ_MIN_CASHED_BDS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t bufs_in_chain = bd_chain->capacity - num_bufs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (bufs_in_chain >= USTORM_TOE_GRQ_CACHE_NUM_BDS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_bufs = USTORM_TOE_GRQ_CACHE_NUM_BDS - bufs_in_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if (filling_mode == FILL_GRQ_LOW_THRESHOLD) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t bufs_in_chain = bd_chain->capacity - num_bufs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(grq->low_bds_threshold < USTORM_TOE_GRQ_CACHE_NUM_BDS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (grq->low_bds_threshold < USTORM_TOE_GRQ_CACHE_NUM_BDS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->low_bds_threshold = 3*GRQ_XOFF_TH;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (bufs_in_chain >= grq->low_bds_threshold) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_bufs = grq->low_bds_threshold - bufs_in_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (grq->high_bds_threshold) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t bufs_in_chain = bd_chain->capacity - num_bufs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (bufs_in_chain >= grq->high_bds_threshold) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_bufs = grq->high_bds_threshold - bufs_in_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (num_bufs < num_bufs_threshold) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (num_bufs > num_bypass_buffs) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_bufs = (u16_t)num_bypass_buffs; /* Partly fill grq from bypass only*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->gen_bufs_compensated_from_bypass_only += num_bypass_buffs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!num_bufs) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0; /* nothing to fill or to fill later and more
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi to avoid abundant GEN_POOL_LOCK acquiring*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (num_bypass_buffs < num_bufs) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we can safely cast the returned value since we know we ask for max 2^16 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t num_required_buffs = num_bufs - num_bypass_buffs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_get_gen_bufs(pdev, &tmp_gen_buf_list, num_required_buffs, sb_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while ((d_list_entry_cnt(&tmp_gen_buf_list) < num_bufs) && num_bypass_buffs) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_gen_buf_t * tmp_buf = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_entry_t * curr_entry = d_list_pop_head(bypass_gen_pool_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tmp_buf = (lm_tcp_gen_buf_t *)curr_entry;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!curr_entry);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tmp_buf->flags & GEN_FLAG_FREE_WHEN_DONE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_head(&free_gen_buf_list, curr_entry);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_head(&tmp_gen_buf_list, curr_entry);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_bypass_buffs--;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_bufs = (u16_t)d_list_entry_cnt(&tmp_gen_buf_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((bypass_gen_pool_list != NULL) && d_list_entry_cnt(&free_gen_buf_list))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_add_tail(bypass_gen_pool_list, &free_gen_buf_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* stats... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->num_grqs_last_dpc = num_bufs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (grq->num_grqs_last_dpc) { /* Exclude zeroed value from statistics*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (grq->num_grqs_last_dpc > grq->max_grqs_per_dpc) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->max_grqs_per_dpc = grq->num_grqs_last_dpc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we don't want to wrap around...*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((grq->sum_grqs_last_x_dpcs + grq->num_grqs_last_dpc) < grq->sum_grqs_last_x_dpcs) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->avg_dpc_cnt = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->sum_grqs_last_x_dpcs = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->sum_grqs_last_x_dpcs += grq->num_grqs_last_dpc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->avg_dpc_cnt++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi avg_dpc_cnt = grq->avg_dpc_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (avg_dpc_cnt) { /*Prevent division by 0*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->avg_grqs_per_dpc = grq->sum_grqs_last_x_dpcs / avg_dpc_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->sum_grqs_last_x_dpcs = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(num_bufs != tmp_gen_buf_list.cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (num_bufs < bd_chain->bd_left) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->num_deficient++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!num_bufs) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4rx, "no buffers returned from generic pool\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0; /* nothing to do */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi curr_gen_buf = (lm_tcp_gen_buf_t *)d_list_peek_head(&tmp_gen_buf_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (filling_mode == FILL_GRQ_LOW_THRESHOLD) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->gen_bufs_compensated_till_low_threshold += num_bufs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (num_bufs--) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(SIG(curr_gen_buf->buf_virt) != L4GEN_BUFFER_SIG);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4rx, "curr_gen_buf->buf_virt=0x%p, END_SIG=0x%x\n", curr_gen_buf->buf_virt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi END_SIG(curr_gen_buf->buf_virt, LM_TCP_GEN_BUF_SIZE(pdev)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(END_SIG(curr_gen_buf->buf_virt, LM_TCP_GEN_BUF_SIZE(pdev)) != L4GEN_BUFFER_SIG_END);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* initialize curr_gen_buf */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi curr_gen_buf->ind_bytes = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi curr_gen_buf->ind_nbufs = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi curr_gen_buf->placed_bytes = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi curr_gen_buf->refcnt = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi curr_gen_buf->tcp = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq_bd = (struct toe_rx_grq_bd *)lm_toe_bd_chain_produce_bd(bd_chain);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!grq_bd);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* attach gen buf to grq */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!curr_gen_buf || !curr_gen_buf->buf_phys.as_u64);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq_bd->addr_hi = curr_gen_buf->buf_phys.as_u32.high;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq_bd->addr_lo = curr_gen_buf->buf_phys.as_u32.low;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi curr_gen_buf = (lm_tcp_gen_buf_t *)d_list_next_entry(&curr_gen_buf->link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* enlist gen buf to active list will be done at the end of the loop (more efficient) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (bd_chain->bd_left) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4rx, "GRQ bd-chain wasn't filled completely\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (d_list_entry_cnt(&tmp_gen_buf_list))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_add_tail(&grq->active_gen_list, &tmp_gen_buf_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (tmp_gen_buf_list.cnt != 0); /* how many buffers were actually placed */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * initialize l4 VBD resources
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - lm_init_params was already called
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - lm_tcp_alloc_resc was already called
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - um GRQ pool is ready to supply buffers to lm (?)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_init_resc(struct _lm_device_t *pdev, u8_t b_is_init )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_toe_info_t *toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t *bd_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi long i;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t volatile * sb_indexes;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t sb_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "##lm_tcp_init_resc\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info = &pdev->toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info->state = LM_TOE_STATE_INIT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init rest of toe_info fields */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info->rss_update_cnt = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info->gen_buf_size = lm_tcp_calc_gen_buf_size(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TCP_SET_UPDATE_WINDOW_MODE(pdev, LM_TOE_UPDATE_MODE_SHORT_LOOP);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_init )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_init(&toe_info->state_blk.neigh_list, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_init(&toe_info->state_blk.path_list, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_init(&toe_info->state_blk.tcp_list, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TODO: consider enabling the assertion */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //DbgBreakIf(pdev->ofld_info.state_blks[STATE_BLOCK_TOE]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->ofld_info.state_blks[STATE_BLOCK_TOE] = &toe_info->state_blk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FOREACH_TSS_IDX(pdev, i)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init SCQs */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_scq_t *scq = &toe_info->scqs[i];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &scq->bd_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->bd_chain_phy, (u16_t)pdev->params.l4_scq_page_cnt, sizeof(struct toe_tx_cqe), 1, TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Assign the SCQ chain consumer pointer to the consumer index in the status block. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_id = RSS_ID_TO_SB_ID(i);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef _VBD_
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CHIP_IS_E1x(pdev) && (pdev->params.l4_enable_rss == L4_RSS_DISABLED))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_id = LM_NON_RSS_SB(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_indexes = lm_get_sb_indexes(pdev, (u8_t)sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_indexes[HC_INDEX_TOE_TX_CQ_CONS] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi scq->hw_con_idx_ptr = sb_indexes + HC_INDEX_TOE_TX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi scq->hc_sb_info.hc_sb = STATUS_BLOCK_NORMAL_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi scq->hc_sb_info.hc_index_value = HC_INDEX_TOE_TX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Before initializing GRQs, we need to check if there are left-overs from before (incase this isn't the iniitiali 'init', for that we need to clear
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * them - but outside the loop... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( !b_is_init ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we need to return what ever buffers are still on the grq back to the pool before
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the new initialization... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_clear_grqs(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FOREACH_RSS_IDX(pdev, i)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rcq_t *rcq = &toe_info->rcqs[i];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_grq_t *grq = &toe_info->grqs[i];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t byte_counter_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_id = RSS_ID_TO_SB_ID(i);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef _VBD_
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CHIP_IS_E1x(pdev) && (pdev->params.l4_enable_rss == L4_RSS_DISABLED))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_id = LM_NON_RSS_SB(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi byte_counter_id = CHIP_IS_E1x(pdev)? LM_FW_SB_ID(pdev, sb_id) : LM_FW_DHC_QZONE_ID(pdev, sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init RCQs */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &rcq->bd_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->bd_chain_phy, (u16_t)pdev->params.l4_rcq_page_cnt, sizeof(struct toe_rx_cqe), 1, TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->rss_update_pending = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->suspend_processing = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->update_cid = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Assign the RCQ chain consumer pointer to the consumer index in the status block. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_indexes = lm_get_sb_indexes(pdev, (u8_t)sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_indexes[HC_INDEX_TOE_RX_CQ_CONS] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->hw_con_idx_ptr = sb_indexes + HC_INDEX_TOE_RX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->hc_sb_info.hc_sb = STATUS_BLOCK_NORMAL_SL_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->hc_sb_info.hc_index_value = HC_INDEX_TOE_RX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->hc_sb_info.iro_dhc_offset = CSTORM_BYTE_COUNTER_OFFSET(byte_counter_id, HC_INDEX_TOE_RX_CQ_CONS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "Dhc not implemented for VF yet\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init GRQs */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_init )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_init(&grq->active_gen_list, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_init(&grq->aux_gen_list, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((u8_t)i != LM_TOE_BASE_RSS_ID(pdev) ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->grq_compensate_on_alloc = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.grqs[i].high_bds_threshold = 3*GRQ_XOFF_TH + 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->grq_compensate_on_alloc = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.grqs[i].high_bds_threshold = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->low_bds_threshold = 3*GRQ_XOFF_TH;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &grq->bd_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->bd_chain_phy, (u16_t)pdev->params.l4_grq_page_cnt, sizeof(struct toe_rx_grq_bd), 0, TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* fill GRQ (minimum mode)*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_fill_grq(pdev, (u8_t)i, NULL, FILL_GRQ_MIN_CASHED_BDS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FOREACH_RSS_IDX(pdev, i)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // lm_tcp_grq_t *grq = &toe_info->grqs[i];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_fill_grq(pdev, (u8_t)i, NULL, FILL_GRQ_FULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* init cstorm internal memory for toe
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * assumption - strom's common intmem (if any) already initiated */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_tcp_init_cstorm_intmem(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_toe_info_t *toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t phys_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_scq_t *scq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t drv_toe_rss_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t port;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t fw_sb_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info = &pdev->toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi port = PORT_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FOREACH_TSS_IDX(pdev, drv_toe_rss_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi scq = &toe_info->scqs[drv_toe_rss_id];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* SCQ consumer ptr - scq first page addr */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phys_addr = lm_bd_chain_phys_addr(&scq->bd_chain, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(CSTORM_TOE_CQ_CONS_PTR_LO_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, CSTORM_TOE_CQ_CONS_PTR_LO_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), phys_addr.as_u32.low, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (CSTORM_TOE_CQ_CONS_PTR_HI_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, CSTORM_TOE_CQ_CONS_PTR_HI_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), phys_addr.as_u32.high, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* SCQ producer idx */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi idx = lm_bd_chain_prod_idx(&scq->bd_chain);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(CSTORM_TOE_CQ_PROD_SIZE != 2);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev, CSTORM_TOE_CQ_PROD_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), idx, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* SCQ consumer idx */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi idx = lm_bd_chain_cons_idx(&scq->bd_chain);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(idx != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(CSTORM_TOE_CQ_CONS_SIZE != 2);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev, CSTORM_TOE_CQ_CONS_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), idx, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* SCQ second page addr */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phys_addr = lm_bd_chain_phys_addr(&scq->bd_chain, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(CSTORM_TOE_CQ_NEXT_PAGE_BASE_ADDR_LO_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, CSTORM_TOE_CQ_NEXT_PAGE_BASE_ADDR_LO_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), phys_addr.as_u32.low, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(CSTORM_TOE_CQ_NEXT_PAGE_BASE_ADDR_HI_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, CSTORM_TOE_CQ_NEXT_PAGE_BASE_ADDR_HI_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), phys_addr.as_u32.high, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(CSTORM_TOE_CQ_NXT_PAGE_ADDR_VALID_SIZE != 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, CSTORM_TOE_CQ_NXT_PAGE_ADDR_VALID_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), 1, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //LM_INTMEM_WRITE8(pdev, CSTORM_TOE_STATUS_BLOCK_ID_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi fw_sb_id = LM_FW_SB_ID(pdev, RSS_ID_TO_SB_ID(drv_toe_rss_id));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef _VBD_
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CHIP_IS_E1x(pdev) && (pdev->params.l4_enable_rss == L4_RSS_DISABLED))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi fw_sb_id = LM_FW_SB_ID(pdev, RSS_ID_TO_SB_ID(LM_NON_RSS_SB(pdev)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (drv_toe_rss_id != LM_NON_RSS_CHAIN(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, CSTORM_TOE_STATUS_BLOCK_ID_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), fw_sb_id, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, CSTORM_TOE_STATUS_BLOCK_INDEX_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), HC_INDEX_TOE_TX_CQ_CONS, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* init ustorm offload params private to TOE */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_set_ofld_params_ustorm_toe(lm_device_t *pdev, l4_ofld_params_t *l4_params)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t func;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t val32;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi func = FUNC_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* global push timer ticks */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This value is in milliseconds instead of ticks in SNP
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and Longhorn. In the future microsoft will change these
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * values to ticks. TBA : When fix takes place, uncomment first line and remove second line */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* val32 = lm_time_resolution(pdev, l4_params->push_ticks, l4_params->ticks_per_second, 1000); */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi val32 = lm_time_resolution(pdev, l4_params->push_ticks, 1000, 1000);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_TCP_PUSH_TIMER_TICKS_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, USTORM_TOE_TCP_PUSH_TIMER_TICKS_OFFSET(func), val32, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* init ustorm internal memory for toe
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * assumption - strom's common intmem (if any) already initiated */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_tcp_init_ustorm_intmem(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_toe_info_t *toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t phys_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rcq_t *rcq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_grq_t *grq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_rx_grq_bd *grq_bd;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t drv_toe_rss_id, grq_bd_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t port;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t fw_sb_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t sw_sb_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info = &pdev->toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi port = PORT_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_set_ofld_params_ustorm_toe(pdev, &(pdev->ofld_info.l4_params));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FOREACH_RSS_IDX(pdev,drv_toe_rss_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq = &toe_info->rcqs[drv_toe_rss_id];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq = &toe_info->grqs[drv_toe_rss_id];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GRQ cache bds */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq_bd = (struct toe_rx_grq_bd *)grq->bd_chain.bd_chain_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( USTORM_TOE_GRQ_CACHE_NUM_BDS > lm_bd_chain_usable_bds_per_page(&grq->bd_chain));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(grq_bd_idx = 0; grq_bd_idx < USTORM_TOE_GRQ_CACHE_NUM_BDS; grq_bd_idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, USTORM_GRQ_CACHE_BD_LO_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id) ,port,grq_bd_idx), grq_bd->addr_lo, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, USTORM_GRQ_CACHE_BD_HI_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id),port,grq_bd_idx), grq_bd->addr_hi, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq_bd++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GRQ cache prod idx */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_GRQ_LOCAL_PROD_SIZE != 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, USTORM_TOE_GRQ_LOCAL_PROD_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), (u8_t)USTORM_TOE_GRQ_CACHE_NUM_BDS, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GRQ cache cons idx */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_GRQ_LOCAL_CONS_SIZE != 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, USTORM_TOE_GRQ_LOCAL_CONS_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), 0, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GRQ producer idx */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi idx = lm_bd_chain_prod_idx(&grq->bd_chain);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_GRQ_PROD_SIZE != 2);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev, USTORM_TOE_GRQ_PROD_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), idx, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GRQ consumer idx */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_GRQ_CONS_SIZE != 2);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev, USTORM_TOE_GRQ_CONS_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), (u8_t)USTORM_TOE_GRQ_CACHE_NUM_BDS, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GRQ consumer ptr */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phys_addr = lm_bd_chain_phys_addr(&grq->bd_chain, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INC64(&phys_addr, sizeof(struct toe_rx_grq_bd) * USTORM_TOE_GRQ_CACHE_NUM_BDS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_GRQ_CONS_PTR_LO_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, USTORM_TOE_GRQ_CONS_PTR_LO_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), phys_addr.as_u32.low, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_GRQ_CONS_PTR_HI_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, USTORM_TOE_GRQ_CONS_PTR_HI_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), phys_addr.as_u32.high, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Generic buffer size */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_GRQ_BUF_SIZE_SIZE != 2);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(LM_TCP_GEN_BUF_SIZE(pdev) > 0xffff); /* the size available in ustorm */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev, USTORM_TOE_GRQ_BUF_SIZE_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), (u16_t)LM_TCP_GEN_BUF_SIZE(pdev), BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* RCQ consumer ptr - rcq first page addr */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phys_addr = lm_bd_chain_phys_addr(&rcq->bd_chain, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_CQ_CONS_PTR_LO_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, USTORM_TOE_CQ_CONS_PTR_LO_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), phys_addr.as_u32.low, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_CQ_CONS_PTR_HI_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, USTORM_TOE_CQ_CONS_PTR_HI_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), phys_addr.as_u32.high, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* RCQ second page addr */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phys_addr = lm_bd_chain_phys_addr(&rcq->bd_chain, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_CQ_NEXT_PAGE_BASE_ADDR_LO_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, USTORM_TOE_CQ_NEXT_PAGE_BASE_ADDR_LO_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), phys_addr.as_u32.low, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_CQ_NEXT_PAGE_BASE_ADDR_HI_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, USTORM_TOE_CQ_NEXT_PAGE_BASE_ADDR_HI_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), phys_addr.as_u32.high, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_CQ_NXT_PAGE_ADDR_VALID_SIZE != 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, USTORM_TOE_CQ_NXT_PAGE_ADDR_VALID_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), 1, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* RCQ producer idx */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi idx = lm_bd_chain_prod_idx(&rcq->bd_chain);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_CQ_PROD_SIZE != 2);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev, USTORM_TOE_CQ_PROD_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), idx, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.enable_dynamic_hc[HC_INDEX_TOE_RX_CQ_CONS]) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t l4_quasi_byte_counter;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t prod_idx_diff = lm_bd_chain_prod_idx(&rcq->bd_chain) - rcq->bd_chain.bds_per_page * rcq->bd_chain.page_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_quasi_byte_counter = prod_idx_diff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_quasi_byte_counter <<= 16;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// LM_INTMEM_WRITE32(pdev, CSTORM_BYTE_COUNTER_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), HC_INDEX_TOE_RX_CQ_CONS), l4_quasi_byte_counter, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, rcq->hc_sb_info.iro_dhc_offset, l4_quasi_byte_counter, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* RCQ consumer idx */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi idx = lm_bd_chain_cons_idx(&rcq->bd_chain);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(idx != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_TOE_CQ_CONS_SIZE != 2);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev, USTORM_TOE_CQ_CONS_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), idx, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi fw_sb_id = LM_FW_SB_ID(pdev, RSS_ID_TO_SB_ID(drv_toe_rss_id));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sw_sb_id = RSS_ID_TO_SB_ID(drv_toe_rss_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (RSS_ID_TO_SB_ID(drv_toe_rss_id) >= MAX_NDSB) { //To suppress Prefast warning
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef _VBD_
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CHIP_IS_E1x(pdev) && (pdev->params.l4_enable_rss == L4_RSS_DISABLED))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi fw_sb_id = LM_FW_SB_ID(pdev, RSS_ID_TO_SB_ID(LM_NON_RSS_SB(pdev)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sw_sb_id = LM_NON_RSS_SB(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (drv_toe_rss_id != LM_NON_RSS_CHAIN(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_IS_E1x(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.enable_dynamic_hc[HC_INDEX_TOE_RX_CQ_CONS]) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.status_blocks_arr[RSS_ID_TO_SB_ID(drv_toe_rss_id)].hc_status_block_data.e1x_sb_data.index_data[HC_INDEX_TOE_RX_CQ_CONS].flags |= HC_INDEX_DATA_DYNAMIC_HC_ENABLED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.status_blocks_arr[RSS_ID_TO_SB_ID(drv_toe_rss_id)].hc_status_block_data.e1x_sb_data.index_data[HC_INDEX_TOE_RX_CQ_CONS].flags &= ~HC_INDEX_DATA_DYNAMIC_HC_ENABLED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(PFDEV(pdev), CSTORM_STATUS_BLOCK_DATA_OFFSET(fw_sb_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi + OFFSETOF(struct hc_status_block_data_e1x, index_data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi + sizeof(struct hc_index_data)*HC_INDEX_TOE_RX_CQ_CONS
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi + OFFSETOF(struct hc_index_data,flags),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.status_blocks_arr[RSS_ID_TO_SB_ID(drv_toe_rss_id)].hc_status_block_data.e1x_sb_data.index_data[HC_INDEX_ETH_RX_CQ_CONS].flags, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.enable_dynamic_hc[HC_INDEX_TOE_RX_CQ_CONS]) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.status_blocks_arr[sw_sb_id].hc_status_block_data.e2_sb_data.index_data[HC_INDEX_TOE_RX_CQ_CONS].flags |= HC_INDEX_DATA_DYNAMIC_HC_ENABLED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.status_blocks_arr[sw_sb_id].hc_status_block_data.e2_sb_data.index_data[HC_INDEX_TOE_RX_CQ_CONS].flags &= ~HC_INDEX_DATA_DYNAMIC_HC_ENABLED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(PFDEV(pdev), CSTORM_STATUS_BLOCK_DATA_OFFSET(fw_sb_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi + OFFSETOF(struct hc_status_block_data_e2, index_data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi + sizeof(struct hc_index_data)*HC_INDEX_TOE_RX_CQ_CONS
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi + OFFSETOF(struct hc_index_data,flags),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.status_blocks_arr[sw_sb_id].hc_status_block_data.e2_sb_data.index_data[HC_INDEX_ETH_RX_CQ_CONS].flags, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// LM_INTMEM_WRITE8(pdev, USTORM_TOE_STATUS_BLOCK_ID_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port),LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, USTORM_TOE_STATUS_BLOCK_ID_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port),fw_sb_id, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, USTORM_TOE_STATUS_BLOCK_INDEX_OFFSET(LM_TOE_FW_RSS_ID(pdev,drv_toe_rss_id), port), HC_INDEX_TOE_RX_CQ_CONS, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Initialize Indirection Table : Only in entries that match status - blocks : L4 base--> L4 base + cnt */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (USTORM_INDIRECTION_TABLE_ENTRY_SIZE != 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_enable_rss == L4_RSS_DISABLED) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FOREACH_RSS_IDX(pdev, idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, USTORM_INDIRECTION_TABLE_OFFSET(port) + LM_TOE_FW_RSS_ID(pdev,idx), LM_TOE_FW_RSS_ID(pdev,(u8_t)idx), BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < RSS_INDIRECTION_TABLE_SIZE; idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev,USTORM_INDIRECTION_TABLE_OFFSET(port) + idx, pdev->toe_info.indirection_table[idx], BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* init tstorm offload params common to TOE/RDMA/ISCSI */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_set_ofld_params_tstorm_common(lm_device_t *pdev, l4_ofld_params_t *l4_params)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t func;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t dup_ack_threshold;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi func = FUNC_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dup_ack_threshold = l4_params->dup_ack_threshold;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(dup_ack_threshold > TCP_TSTORM_MAX_DUP_ACK_TH) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "given dup_ack_threshold (=%d) too high. setting it to maximum allowed (=%d)\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dup_ack_threshold, TCP_TSTORM_MAX_DUP_ACK_TH);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dup_ack_threshold = TCP_TSTORM_MAX_DUP_ACK_TH;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (TSTORM_TCP_DUPLICATE_ACK_THRESHOLD_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, TSTORM_TCP_DUPLICATE_ACK_THRESHOLD_OFFSET(func), dup_ack_threshold, BAR_TSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* MaxCwnd */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (TSTORM_TCP_MAX_CWND_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(pdev->params.network_type == LM_NETOWRK_TYPE_WAN) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, TSTORM_TCP_MAX_CWND_OFFSET(func), pdev->params.max_cwnd_wan, BAR_TSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->params.network_type != LM_NETOWRK_TYPE_LAN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, TSTORM_TCP_MAX_CWND_OFFSET(func), pdev->params.max_cwnd_lan, BAR_TSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* init tstorm offload params private to TOE */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_set_ofld_params_tstorm_toe(lm_device_t *pdev, l4_ofld_params_t *l4_params)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t func;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi func = FUNC_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* max retransmit (TOE param only) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (TSTORM_TOE_MAX_SEG_RETRANSMIT_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, TSTORM_TOE_MAX_SEG_RETRANSMIT_OFFSET(func), l4_params->max_retx, BAR_TSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TcpDoubtReachability (TOE param only) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (TSTORM_TOE_DOUBT_REACHABILITY_SIZE != 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, TSTORM_TOE_DOUBT_REACHABILITY_OFFSET(func), l4_params->doubt_reachability_retx, BAR_TSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* init tstorm internal memory for toe
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * assumption - strom's common intmem already initiated */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_tcp_init_tstorm_intmem(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_set_ofld_params_tstorm_toe(pdev, &(pdev->ofld_info.l4_params));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (TSTORM_TOE_MAX_DOMINANCE_VALUE_SIZE != 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, TSTORM_TOE_MAX_DOMINANCE_VALUE_OFFSET, (u8_t)pdev->params.l4_max_dominance_value, BAR_TSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (TSTORM_TOE_DOMINANCE_THRESHOLD_SIZE != 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, TSTORM_TOE_DOMINANCE_THRESHOLD_OFFSET, (u8_t)pdev->params.l4_dominance_threshold, BAR_TSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* init xstorm offload params common to TOE/RDMA/ISCSI */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_set_ofld_params_xstorm_common(lm_device_t *pdev, l4_ofld_params_t *l4_params)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t func, ack_frequency;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t val32, max_reg, tmr_reg, delayed_ack_ticks;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi func = FUNC_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (PORT_ID(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi max_reg = XCM_REG_GLB_DEL_ACK_MAX_CNT_1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tmr_reg = XCM_REG_GLB_DEL_ACK_TMR_VAL_1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi max_reg = XCM_REG_GLB_DEL_ACK_MAX_CNT_0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tmr_reg = XCM_REG_GLB_DEL_ACK_TMR_VAL_0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* if ack_frequency is 0, it means use default value of 2. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* delayed max ack count, (both in internal ram and in XCM!!!) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ack_frequency = l4_params->ack_frequency;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(ack_frequency < TCP_XCM_MIN_GLB_DEL_ACK_MAX_CNT) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "given ack_frequency (=%d) too low. setting it to minimum allowed (=%d)\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ack_frequency, TCP_XCM_DEFAULT_DEL_ACK_MAX_CNT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ack_frequency = TCP_XCM_DEFAULT_DEL_ACK_MAX_CNT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (XSTORM_TCP_GLOBAL_DEL_ACK_COUNTER_MAX_COUNT_SIZE != 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, XSTORM_TCP_GLOBAL_DEL_ACK_COUNTER_MAX_COUNT_OFFSET(func), ack_frequency, BAR_XSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pdev, max_reg, ack_frequency);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This value is in milliseconds instead of ticks in SNP
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and Longhorn. In the future microsoft will change these
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * values to ticks. TBA : When fix takes place, uncomment first line and remove second line */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* delayed_ack_ticks = lm_time_resolution(pdev, l4_params->delayed_ack_ticks, l4_params->ticks_per_second, 1000); */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi delayed_ack_ticks = lm_time_resolution(pdev, l4_params->delayed_ack_ticks, 1000, TIMERS_TICKS_PER_SEC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* delayed ack timer */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pdev, tmr_reg, delayed_ack_ticks);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* sws timer */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This value (sws_prevention_ticks) is in milliseconds instead of ticks in SNP
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and Longhorn. In the future microsoft will change these
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * values to ticks. TBA : When fix takes place, uncomment first line and remove second line */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* val32 = lm_time_resolution(pdev, l4_params->sws_prevention_ticks, l4_params->ticks_per_second, TIMERS_TICKS_PER_SEC); */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi val32 = lm_time_resolution(pdev, l4_params->sws_prevention_ticks, 1000 , TIMERS_TICKS_PER_SEC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (XSTORM_TCP_TX_SWS_TIMER_VAL_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, XSTORM_TCP_TX_SWS_TIMER_VAL_OFFSET(func), val32, BAR_XSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (XSTORM_COMMON_RTC_RESOLUTION_SIZE != 2);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev, XSTORM_COMMON_RTC_RESOLUTION_OFFSET, 1000 / l4_params->ticks_per_second , BAR_XSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* init xstorm offload params private to TOE */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_set_ofld_params_xstorm_toe(lm_device_t *pdev, l4_ofld_params_t *l4_params)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t func;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi func = FUNC_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (XSTORM_TOE_LLC_SNAP_ENABLED_SIZE != 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(l4_params->flags & OFLD_PARAM_FLAG_SNAP_ENCAP) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, XSTORM_TOE_LLC_SNAP_ENABLED_OFFSET(func), 1, BAR_XSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, XSTORM_TOE_LLC_SNAP_ENABLED_OFFSET(func), 0, BAR_XSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* init xstorm internal memory for toe
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * assumption - strom's common intmem already initiated */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_tcp_init_xstorm_intmem(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_set_ofld_params_xstorm_toe(pdev, &(pdev->ofld_info.l4_params));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * init chip internal memory and hw that is common for TOE, ISCSI and RDMA
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - lm_init_params was already called
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_init_chip_common(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_ofld_params_t l4_params;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t func;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "###lm_tcp_init_chip_common\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi func = FUNC_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_get_default_l4cli_params(pdev, &l4_params);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->ofld_info.l4_params = l4_params;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init common internal memory/hw for each storm
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * (c+u storms do not have common offload params) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_set_ofld_params_xstorm_common(pdev, &l4_params);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_set_ofld_params_tstorm_common(pdev, &l4_params);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init internal memory constatns (non-dependant on l4_params)*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* enable delayed acks */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (XSTORM_TCP_GLOBAL_DEL_ACK_COUNTER_ENABLED_SIZE != 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE8(pdev, XSTORM_TCP_GLOBAL_DEL_ACK_COUNTER_ENABLED_OFFSET(func), 1 /* always enabled */, BAR_XSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* ip id (init value currently constant: 0x8000) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf (XSTORM_TCP_IPID_SIZE != 2);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev, XSTORM_TCP_IPID_OFFSET(func), TOE_XSTORM_IP_ID_INIT_HI, BAR_XSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * init chip internal memory for L4
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_init_chip(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "##lm_tcp_init_chip\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GilR 4/9/2006 - TODO - Assaf - RSS indirection table default initialization, done in L2? */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init XSTORM internal RAM */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_tcp_init_xstorm_intmem(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init CSTORM internal RAM */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_tcp_init_cstorm_intmem(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init TSTORM internal RAM */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_tcp_init_tstorm_intmem(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init USTORM internal RAM */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_tcp_init_ustorm_intmem(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * send TOE START ramrod wait for completion and return
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - there is no pending slow path request for the leading connection (cid=0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - interrupts are already enabled
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_start_chip(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_toe_info_t *toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t to_cnt = 100000; /* GilR 4/9/2006 - TBA - 'to_cnt' in lm_tcp_init_chip need to be removed? */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u64_t data;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_init_ramrod_data toe_init_data;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "##lm_tcp_start_chip\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info = &pdev->toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* send TOE INIT ramrod and wait for completion */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(toe_info->state != LM_TOE_STATE_INIT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_init_data.rss_num = LM_TOE_FW_RSS_ID(pdev,LM_TOE_BASE_RSS_ID(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data = *((u64_t*)(&toe_init_data));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_command_post(pdev, LM_SW_LEADING_RSS_CID(pdev), RAMROD_OPCODE_TOE_INIT, CMD_PRIORITY_NORMAL, TOE_CONNECTION_TYPE, data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (toe_info->state != LM_TOE_STATE_NORMAL && to_cnt) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_wait(pdev,100);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi to_cnt--;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GilR 5/16/2006 - TODO - DbgBreakIf(toe_info->state != LM_TOE_STATE_NORMAL); commented out for windows user mode */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(toe_info->state != LM_TOE_STATE_NORMAL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifndef _VBD_CMD_
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "TOE init ramrod did not complete\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info->state = LM_TOE_STATE_NORMAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_INIT, TOE_CONNECTION_TYPE, LM_SW_LEADING_RSS_CID(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #if defined(_VBD_)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* cid recycled cb registration */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_cid_recycled_cb_register(pdev, TOE_CONNECTION_TYPE, lm_tcp_recycle_cid_cb);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Sq-completion cb registration (sq that get completed internally in driver */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_comp_cb_register(pdev, TOE_CONNECTION_TYPE, lm_tcp_comp_cb);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * allocate and initiate l4 (lm driver and chip)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - lm_init_params was already called
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - um GRQ pool is ready to supply buffers to lm (?)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - there is no pending slow path request for the leading connection (cid=0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - interrupts are already enabled
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_init(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_toe_info_t *toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "###lm_tcp_init\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_VFDEV(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "###lm_tcp_init is not supported for VF\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info = &pdev->toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(toe_info, 0 , sizeof(lm_toe_info_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info->pdev = pdev;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* allocate resources */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_alloc_resc(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((lm_status!=LM_STATUS_SUCCESS) && DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* initialize resources */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_init_resc(pdev, TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status!=LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* initialize chip resources */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_init_chip(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status!=LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* activate chip for tcp */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_start_chip(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status!=LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * handle TOE init protocol ramrod completion */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_init_ramrod_comp(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_toe_info_t *toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "##lm_tcp_init_ramrod_comp\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info = &pdev->toe_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(toe_info->state != LM_TOE_STATE_INIT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_info->state = LM_TOE_STATE_NORMAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * handle TOE RSS-update ramrod completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - called once for each RCQ
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_rss_update_ramrod_comp(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rcq_t *rcq,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t update_stats_type,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t update_suspend_rcq)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* decrement the completion count and check if we need to suspend processing */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(rcq->suspend_processing == TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Update update statistics - These statistics indicate which FW flow was taken and also count the overall number of updates */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "lm_tcp_rss_update_ramrod_comp(): %d\n",update_stats_type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (update_stats_type) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case TOE_RSS_UPD_QUIET:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->rss_update_stats_quiet++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case TOE_RSS_UPD_SLEEPING:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->rss_update_stats_sleeping++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case TOE_RSS_UPD_DELAYED:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->rss_update_stats_delayed++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This is a hack due to the fact the FW has a hard time providing the cid on which the ramrod was sent on */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* I know that I sent the ramrod on the leading connection so I use it here instead of the cid on the cqe (update cid) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If the driver ever changes the cid on which the rmarod is snt on this line will have to be changed as well - UGLY, UGLY */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->update_cid = LM_SW_LEADING_RSS_CID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This is what should have been if the FW alwys put the ramrod cid on these completions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->update_cid = cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (update_suspend_rcq) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rss_update_suspend_rcq(pdev, rcq);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->rss_update_processing_delayed++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Checks whether the rcq processing should be suspended as a result of an rss update
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_rss_update_suspend_rcq(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_rcq_t * rcq)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * cookie = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This function is called once when an update completion is encountered and the rcq porcessing is not suspended yet.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * At all other times it is called only if the rcq processing is already suspended. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (rcq->suspend_processing == FALSE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* decrment the expected completion counter */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_dec(&pdev->params.update_comp_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Toe specific... to determine who completes the ramrod. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (mm_atomic_dec(&pdev->params.update_toe_comp_cnt) == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Everyone is done. Time to return credit to the slowpath ring... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_RSS_UPDATE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi TOE_CONNECTION_TYPE, LM_TOE_FW_RSS_ID(pdev, LM_TOE_BASE_RSS_ID(pdev)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq->suspend_processing = pdev->params.update_toe_comp_cnt ? TRUE : FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (rcq->suspend_processing == FALSE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* processing was suspended and can now be resumed, try to complete the update ramrod */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "lm_tcp_rss_update_suspend_rcq(): calling lm_eth_update_ramrod_comp\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (mm_atomic_dec(&pdev->params.update_suspend_cnt) == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->slowpath_info.set_rss_cookie)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cookie = (void *)pdev->slowpath_info.set_rss_cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.set_rss_cookie = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_set_done(pdev, rcq->update_cid, cookie);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * initiate a caller allocated lm neighbor state
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - caller already zeroed given neigh state
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_init_neigh_state(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_state_block_t *state_blk,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_neigh_state_t *neigh,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_neigh_const_state_t *neigh_const,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_neigh_cached_state_t *neigh_cached,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_neigh_delegated_state_t *neigh_delegated)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "###lm_tcp_init_neigh_state\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(pdev && state_blk && neigh && neigh_const && neigh_cached && neigh_delegated));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh->hdr.state_blk = state_blk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh->hdr.state_id = STATE_ID_NEIGH;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh->hdr.status = STATE_STATUS_NORMAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_tail(&state_blk->neigh_list, &neigh->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh->num_dependents = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(&neigh->neigh_cached, neigh_cached, sizeof(neigh->neigh_cached));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(&neigh->neigh_const, neigh_const, sizeof(neigh->neigh_const));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(&neigh->neigh_delegated, neigh_delegated, sizeof(neigh->neigh_delegated));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh->host_reachability_time = 0; /* SHOULD BE: (mm_get_current_time() - neigh_cached->host_reachability_delta) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh->nic_reachability_time = 0; /* SHOULD BE: (mm_get_current_time() - neigh_delegated->nic_reachability_delta) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh->stale = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * initiate a caller allocated lm path state
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - caller already zeroed given path state
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_init_path_state(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_state_block_t *state_blk,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_path_state_t *path,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_neigh_state_t *neigh,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_path_const_state_t *path_const,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_path_cached_state_t *path_cached,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_path_delegated_state_t *path_delegated)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "###lm_tcp_init_path_state\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(pdev && state_blk && path && neigh && path_const && path_cached && path_delegated));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(neigh->hdr.state_id != STATE_ID_NEIGH || neigh->hdr.status != STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path->hdr.state_blk = state_blk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path->hdr.state_id = STATE_ID_PATH;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path->hdr.status = STATE_STATUS_NORMAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_tail(&state_blk->path_list, &path->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path->neigh = neigh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh->num_dependents++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path->num_dependents = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(&path->path_cached, path_cached, sizeof(path->path_cached));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(&path->path_const, path_const, sizeof(path->path_const));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(&path->path_delegated, path_delegated, sizeof(path->path_delegated));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * initiate a caller allocated lm tcp state
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - caller already zeroed given tcp state
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - caller already set the tx/rx_con pointers of the given
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * tcp state to pre-allocated tx/rx cons
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_init_tcp_state(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_state_block_t *state_blk,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_path_state_t *path,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_tcp_const_state_t *tcp_const,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_tcp_cached_state_t *tcp_cached,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_tcp_delegated_state_t *tcp_delegated,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t tcp_cid_addr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "###lm_tcp_init_tcp_state, ptr=%p, src_port=%d\n", tcp, tcp_const->src_port);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(pdev && state_blk && tcp && path && tcp_const && tcp_cached && tcp_delegated));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(path->hdr.state_id != STATE_ID_PATH || path->hdr.status != STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* We need to determine the ULP_TYPE and get ourselves a cid if one doesn't already exist */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!tcp_cid_addr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->ulp_type = TOE_CONNECTION_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->ulp_type = lm_map_cid_to_proto(pdev, tcp_cid_addr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid = tcp_cid_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_cid_resc(pdev, TOE_CONNECTION_TYPE, tcp, tcp_cid_addr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.state_blk = state_blk;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.state_id = STATE_ID_TCP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.status = STATE_STATUS_INIT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_tail(&state_blk->tcp_list, &tcp->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->path = path;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path->num_dependents++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_ofld++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (tcp->ulp_type == ISCSI_CONNECTION_TYPE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->iscsi_info.run_time.stats.total_ofld++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(&tcp->tcp_cached, tcp_cached, sizeof(tcp->tcp_cached));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(&tcp->tcp_const, tcp_const, sizeof(tcp->tcp_const));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(&tcp->tcp_delegated, tcp_delegated, sizeof(tcp->tcp_delegated));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* the rest of the tcp state's fields that require initialization value other than 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * will be initialized later (when lm_tcp_init_tx_con/lm_tcp_init_rx_con/lm_tcp_init_tcp_context are called) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* calc connection's mss according to path_mtu and remote MSS */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic u32_t _lm_tcp_calc_mss(u32_t path_mtu, u16_t remote_mss, u8_t is_ipv6, u8_t ts_enabled,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t llc_snap_enabled, u8_t vlan_enabled)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define MIN_MTU 576 /* rfc 793 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define IPV4_HDR_LEN 20
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define IPV6_HDR_LEN 40
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define TCP_HDR_LEN 20
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define TCP_OPTION_LEN 12
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define LLC_SNAP_LEN 8
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define VLAN_LEN 4
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mss = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t hdrs = TCP_HDR_LEN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(vlan_enabled);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(llc_snap_enabled);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(is_ipv6) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hdrs += IPV6_HDR_LEN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hdrs += IPV4_HDR_LEN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef LLC_SNAP_HEADER_ROOMS_WITH_PAYLOAD
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LLC_SNAP_HEADER_ROOMS_WITH_PAYLOAD never was defined. Nobody remembers when LLC/SNAP protocol was tested but
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi in any case don't use payload to room LLC/SNAP header
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (llc_snap_enabled) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hdrs += LLC_SNAP_LEN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VLAN_HEADER_ROOMS_WITH_PAYLOAD
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi VLAN_HEADER_ROOMS_WITH_PAYLOAD never was defined and below strings is reminder that once there was problem of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi decreasing (-4) data payload size because of VLAN header rooming with payload CQ39709
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vlan_enabled) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hdrs += VLAN_LEN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(path_mtu < MIN_MTU);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mss = path_mtu - hdrs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(mss > remote_mss) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mss = remote_mss;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(ts_enabled) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mss -= TCP_OPTION_LEN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!mss) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!mss);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mss = 1; /*mss may be used as divider, so let's prevent division by zero*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return mss;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/** Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * calculate the fragment count for a given initial receive window and mss
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The fragment count is based on the maximum size we will need to do for a single
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * indication
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic u32_t _lm_tcp_calc_frag_cnt(lm_device_t * pdev, u32_t initial_rcv_wnd, u32_t mss)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t frag_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi frag_cnt = initial_rcv_wnd / mss;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (frag_cnt < (0x10000 / mss)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi frag_cnt = 0x10000 / mss;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pdev->params.l4_max_rcv_wnd_size > 0x10000) && (frag_cnt > (pdev->params.l4_max_rcv_wnd_size / mss))) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi frag_cnt = pdev->params.l4_max_rcv_wnd_size / mss;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi frag_cnt = frag_cnt * 2 + 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_max_gen_buf_cnt && (frag_cnt > pdev->params.l4_max_gen_buf_cnt)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi frag_cnt = pdev->params.l4_max_gen_buf_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return frag_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t lm_tcp_calc_frag_cnt(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mss, frag_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(pdev && tcp));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mss = _lm_tcp_calc_mss(tcp->path->path_cached.path_mtu,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_const.remote_mss,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->path->path_const.ip_version == IP_VERSION_IPV6),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_const.tcp_flags & TCP_FLAG_ENABLE_TIME_STAMP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FALSE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->path->neigh->neigh_const.vlan_tag != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi frag_cnt = _lm_tcp_calc_frag_cnt(pdev, tcp->tcp_cached.initial_rcv_wnd, mss);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return frag_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_tcp_init_qe_buffer(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_qe_buffer_t * qe_buffer,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t * mem_virt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cnt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t cqe_size)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi qe_buffer->left = cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi qe_buffer->first = (char *)mem_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi qe_buffer->head = qe_buffer->first;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi qe_buffer->tail = qe_buffer->first;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi qe_buffer->last = qe_buffer->first;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi qe_buffer->last += (qe_buffer->left-1)*cqe_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi qe_buffer->qe_size = cqe_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/** Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * function calculates the amount of virtual memory required for the RX connection
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Return
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * amount of virtual memory required
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t lm_tcp_rx_con_get_virt_size(struct _lm_device_t * pdev, lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t frag_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mss;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* The calculation for frag_cnt is based on the calculation from Teton's init_rx_tcp_resc()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * also the assertion is taken from Teton */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->tcp_cached.initial_rcv_wnd == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* the rx_con may not be initialized at this state, therefore we can't rely on the mss being initialized. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mss = _lm_tcp_calc_mss(tcp->path->path_cached.path_mtu,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_const.remote_mss,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->path->path_const.ip_version == IP_VERSION_IPV6),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_const.tcp_flags & TCP_FLAG_ENABLE_TIME_STAMP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->ofld_info.l4_params.flags & OFLD_PARAM_FLAG_SNAP_ENCAP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->path->neigh->neigh_const.vlan_tag != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi frag_cnt = _lm_tcp_calc_frag_cnt(pdev, tcp->tcp_cached.initial_rcv_wnd, mss);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4rx, "Calc #frags for rx-con initial_rcv_wnd: %d frag_cnt: %d\n", tcp->tcp_cached.initial_rcv_wnd, frag_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = sizeof(lm_frag_list_t) + (frag_cnt - 1)*sizeof(lm_frag_t);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_init_tcp_sp_data_mem(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* slow-path physical memory */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* allocation of physical area for sp request */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sp_req_manager_t *sp_req_mgr = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_req_mgr = lm_cid_sp_req_mgr(pdev, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(sp_req_mgr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!sp_req_mgr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(sp_req_mgr->sp_data_phys_addr.as_u32.low & CACHE_LINE_SIZE_MASK);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_req_data.phys_addr = sp_req_mgr->sp_data_phys_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_req_data.virt_addr = sp_req_mgr->sp_data_virt_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_init_tcp_phys_mem(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_phy_mem_block_t * phy_mblk)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t page_cnt,page_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t bd_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t block_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #if (LM_PAGE_SIZE != 4096)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #error (LM_PAGE_SIZE != 4096) /* currently FW assumes a tx chain page is 4KB */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Init physical memory */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* bd-chains */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi page_cnt = (u16_t)pdev->params.l4_tx_chain_page_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_size = sizeof(struct toe_tx_bd);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi block_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0 ; idx < 2; idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = LM_PAGE_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (page_idx = 0; page_idx < page_cnt; page_idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (phy_mblk[block_idx].left < mem_size) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi block_idx++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(block_idx == pdev->params.l4_num_of_blocks_per_connection);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(phy_mblk[block_idx].left < mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_add_page(pdev,&con->bd_chain,phy_mblk[block_idx].free, phy_mblk[block_idx].free_phy, bd_size, TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phy_mblk[block_idx].free += mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phy_mblk[block_idx].left -= mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INC64(&phy_mblk[block_idx].free_phy, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* rx-con */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi page_cnt = (u16_t)pdev->params.l4_rx_chain_page_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_size = sizeof(struct toe_rx_bd);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* slow-path physical memory */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* allocation of physical area for sp request */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = TOE_SP_PHYS_DATA_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (phy_mblk[block_idx].left < mem_size) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi block_idx++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(block_idx == pdev->params.l4_num_of_blocks_per_connection);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(mem_size > phy_mblk[block_idx].left);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(phy_mblk[block_idx].free_phy.as_u32.low & CACHE_LINE_SIZE_MASK);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_req_data.phys_addr = phy_mblk[block_idx].free_phy;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_req_data.virt_addr = (lm_tcp_slow_path_phys_data_t *)phy_mblk[block_idx].free;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(tcp->sp_req_data.virt_addr, 0, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phy_mblk[block_idx].free += mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phy_mblk[block_idx].left -= mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INC64(&phy_mblk[block_idx].free_phy, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* doorbell data */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init tx part */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = TOE_DB_TX_DATA_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (phy_mblk[block_idx].left < mem_size) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi block_idx++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(block_idx == pdev->params.l4_num_of_blocks_per_connection);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(mem_size > phy_mblk[block_idx].left);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(phy_mblk[block_idx].free_phy.as_u32.low & CACHE_LINE_SIZE_MASK);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tx_con->phys_db_data = phy_mblk[block_idx].free_phy;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tx_con->db_data.tx = (volatile struct toe_tx_db_data *)phy_mblk[block_idx].free;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tx_con->db_data.tx->flags = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tx_con->db_data.tx->bds_prod = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init tx db data to snd.una (+ sizeof sent unacked data that will
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * be initiated when sent unacked data is posted): */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tx_con->db_data.tx->bytes_prod_seq = tcp->tcp_delegated.send_una;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phy_mblk[block_idx].free += mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phy_mblk[block_idx].left -= mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INC64(&phy_mblk[block_idx].free_phy, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init rx part */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (phy_mblk[block_idx].left < mem_size) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi block_idx++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(block_idx == pdev->params.l4_num_of_blocks_per_connection);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = TOE_DB_RX_DATA_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(mem_size > phy_mblk[block_idx].left);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(phy_mblk[block_idx].free_phy.as_u32.low & CACHE_LINE_SIZE_MASK);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->phys_db_data = phy_mblk[block_idx].free_phy;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->db_data.rx = (volatile struct toe_rx_db_data *)phy_mblk[block_idx].free;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phy_mblk[block_idx].free += mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phy_mblk[block_idx].left -= mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INC64(&phy_mblk[block_idx].free_phy, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->db_data.rx->rcv_win_right_edge = tcp->tcp_delegated.recv_win_seq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we also need to initialize the driver copy of the rcv_win_right_edge */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.sws_info.drv_rcv_win_right_edge = tcp->tcp_delegated.recv_win_seq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->db_data.rx->bds_prod = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->db_data.rx->bytes_prod = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->db_data.rx->consumed_grq_bytes = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->db_data.rx->flags = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->db_data.rx->reserved1 = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_init_tcp_virt_mem(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_mem_block_t * mblk)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t cqe_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cqe_size = sizeof(struct toe_tx_cqe);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < 2; idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* allocation of buffers for history CQEs */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_history_cqe_cnt) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = pdev->params.l4_history_cqe_cnt*cqe_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(mblk->left < mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_tcp_init_qe_buffer(pdev, &con->history_cqes, mblk->free, pdev->params.l4_history_cqe_cnt, cqe_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mblk->free += mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mblk->left -= mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("MichalS: Currently History Count = 0 is not SUPPORTED\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cqe_size = sizeof(struct toe_rx_cqe);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* rx frag list */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = lm_tcp_rx_con_get_virt_size(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(mblk->left < mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.gen_info.frag_list = (lm_frag_list_t *)mblk->free;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mblk->free += mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mblk->left -= mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_init_tcp_resc(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_mem_block_t * mblk,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_phy_mem_block_t * phy_mblk)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "###lm_tcp_init_tx_con\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(pdev && tcp));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* tx-specific */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tx_con->type = TCP_CON_TYPE_TX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(&tcp->tx_con->u.tx, 0, sizeof(lm_tcp_con_tx_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tx_con->flags = (TCP_POST_BLOCKED | TCP_COMP_BLOCKED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tx_con->tcp_state = tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_init(&tcp->tx_con->active_tb_list, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* rx-specific */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->type = TCP_CON_TYPE_RX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(&tcp->rx_con->u.rx, 0, sizeof(lm_tcp_con_rx_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->flags = (TCP_POST_BLOCKED | TCP_COMP_BLOCKED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->tcp_state = tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_init(&tcp->rx_con->active_tb_list, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_init_tcp_phys_mem(pdev,tcp,phy_mblk);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_init_tcp_virt_mem(pdev,tcp,mblk);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.sws_info.mss = tcp->tx_con->u.tx.mss =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_tcp_calc_mss(tcp->path->path_cached.path_mtu,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_const.remote_mss,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->path->path_const.ip_version == IP_VERSION_IPV6),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_const.tcp_flags & TCP_FLAG_ENABLE_TIME_STAMP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->ofld_info.l4_params.flags & OFLD_PARAM_FLAG_SNAP_ENCAP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->path->neigh->neigh_const.vlan_tag != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.gen_info.max_frag_count = _lm_tcp_calc_frag_cnt(pdev, tcp->tcp_cached.initial_rcv_wnd, tcp->rx_con->u.rx.sws_info.mss);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Function returns the required size for a virtual connection. If tcp_state is given,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the size is calculated for the specific connection given, o/w the default size is given.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t lm_tcp_get_virt_size(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t virt_size = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mss = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t const chain_idx = LM_SW_LEADING_RSS_CID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi virt_size =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.l4_history_cqe_cnt*sizeof(struct toe_tx_cqe) +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.l4_history_cqe_cnt*sizeof(struct toe_rx_cqe);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi virt_size += lm_tcp_rx_con_get_virt_size(pdev,tcp_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #define LM_TCP_DEFAULT_WINDOW_SIZE 0x10000
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF((ARRSIZE(pdev->params.l2_cli_con_params) <= chain_idx) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (CHIP_IS_E1H(pdev) && (chain_idx >= ETH_MAX_RX_CLIENTS_E1H)) || /* TODO E2 add IS_E2*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (CHIP_IS_E1(pdev) && (chain_idx >= ETH_MAX_RX_CLIENTS_E1)) ))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mss = _lm_tcp_calc_mss(pdev->params.l2_cli_con_params[chain_idx].mtu, 0xffff, FALSE, FALSE, FALSE, FALSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi virt_size += sizeof(lm_frag_list_t) +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (_lm_tcp_calc_frag_cnt(pdev, LM_TCP_DEFAULT_WINDOW_SIZE, mss) - 1)*sizeof(lm_frag_t);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return virt_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t lm_tcp_get_phys_size(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mem_size = TOE_SP_PHYS_DATA_SIZE + TOE_DB_TX_DATA_SIZE + TOE_DB_RX_DATA_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = ((mem_size / LM_PAGE_SIZE) + 1) * LM_PAGE_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size += pdev->params.l4_rx_chain_page_cnt*LM_PAGE_SIZE + /* rx bd-chain */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.l4_tx_chain_page_cnt*LM_PAGE_SIZE; /* tx bd-chain */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_post_buffered_data(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_t *buffered_data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_rx_gen_info_t * gen_info = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_gen_buf_t * curr_gen_buf = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!buffered_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!d_list_is_empty(buffered_data)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi gen_info = &tcp->rx_con->u.rx.gen_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi curr_gen_buf = (lm_tcp_gen_buf_t *)d_list_peek_head(buffered_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!d_list_is_empty(&gen_info->peninsula_list));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_add_head(&gen_info->peninsula_list, buffered_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* initialize peninsula_nbytes */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (curr_gen_buf) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi gen_info->peninsula_nbytes += curr_gen_buf->placed_bytes;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi curr_gen_buf = (lm_tcp_gen_buf_t *)d_list_next_entry(&curr_gen_buf->link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->rx_con->flags & TCP_INDICATE_REJECTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->flags |= TCP_RX_COMP_DEFERRED; /* TCP_INDICATE_REJECTED was here to wait rx buffers from OS.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi With TCP_RX_COMP_DEFERRED flag processing of completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SP_REQUEST_INITIATE_OFFLOAD will indicate the buffered data
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if it needed */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* calculate tcp pseudo check sum.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * input and retured value in _network_ order */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic u16_t lm_tcp_calc_tcp_pseudo_checksum(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t n_src_ip[4],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t n_dst_ip[4],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t ip_type)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define D_IP_PROTOCOL_TCP 6
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t sum = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int i;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(ip_type == IP_VERSION_IPV4) { /* IPV4 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sum += n_src_ip[0] & 0xffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sum += (n_src_ip[0]>>16) & 0xffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sum += n_dst_ip[0] & 0xffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sum += (n_dst_ip[0]>>16) & 0xffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < 4; i++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sum += n_src_ip[i] & 0xffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sum += (n_src_ip[i]>>16) & 0xffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < 4; i++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sum += n_dst_ip[i] & 0xffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sum += (n_dst_ip[i]>>16) & 0xffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sum += HTON16((u16_t)(D_IP_PROTOCOL_TCP));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Fold 32-bit sum to 16 bits */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while( sum >> 16 ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sum = (sum & 0xffff) + (sum >> 16);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "_lm_tcp_calc_tcp_pseudo_checksum: n_src_ip=%x, n_dst_ip=%x, (u16_t)sum=%x\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi n_src_ip[0], n_dst_ip[0], (u16_t)sum);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (u16_t)sum;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* find the bd in the bd chain that contains snd_nxt, the offset of snd_nxt
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * within this bd, and the base address of the page that contains this bd. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_locate_snd_next_info(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * tx_con,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t snd_nxt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t snd_una,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t * bd_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t * bd_offset,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t * page_addr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cur_seq = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_tx_bd * cur_tx_bd = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we assume that the first byte of the first application buffer equals SND.UNA
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * we need to find SND.NXT relative to this */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(NULL, VERBOSEl4sp, "### lm_locate_snd_next_info\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* want to make sure the consumer is still zero ... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((tx_con->bd_chain.cons_idx != 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (S32_SUB(tx_con->bytes_post_cnt ,S32_SUB(snd_nxt, snd_una)) < 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tx_con->bytes_comp_cnt))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tx_con->bd_chain.cons_idx != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(S32_SUB(tx_con->bytes_post_cnt ,S32_SUB(snd_nxt, snd_una)) < 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tx_con->bytes_comp_cnt); /* nothing should be completed yet */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *bd_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *bd_offset = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *page_addr = tx_con->bd_chain.bd_chain_phy;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_bd_chain_prod_idx(&tx_con->bd_chain) == 0) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If the producer is '0', chain is empty. bd_idx/offset are 0 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((tx_con->bytes_post_cnt > 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (snd_nxt != snd_una))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tx_con->bytes_post_cnt > 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Notice: This case was seen and its a bug in the MS stack: delegated: snd_nxt > snd_una but WITHOUT unacked data */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(snd_nxt != snd_una);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cur_seq = snd_una;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cur_tx_bd = (struct toe_tx_bd *)tx_con->bd_chain.bd_chain_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while ((*bd_idx < lm_bd_chain_prod_idx(&tx_con->bd_chain))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi && S32_SUB(snd_nxt, cur_seq + cur_tx_bd->size) >= 0) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Advance to the next bd. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cur_seq += cur_tx_bd->size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_incr_bd(&tx_con->bd_chain, page_addr, (void**)&cur_tx_bd, bd_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* make sure assignment is legit. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((S32_SUB(snd_nxt, cur_seq) < 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (S32_SUB(snd_nxt, cur_seq) > 0xffff))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(S32_SUB(snd_nxt, cur_seq) < 0 );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(S32_SUB(snd_nxt, cur_seq) > 0xffff );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *bd_offset = S32_SUB(snd_nxt, cur_seq);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t _lm_tcp_init_xstorm_toe_context(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_context * ctx = (struct toe_context *)tcp->ctx_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct xstorm_toe_ag_context * xctx_ag = &ctx->xstorm_ag_context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct xstorm_toe_st_context * xctx_st = &ctx->xstorm_st_context.context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t mem_phys = {{0}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t bd_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t bd_offset = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* xstorm ag context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(xctx_ag, 0, sizeof(struct xstorm_toe_ag_context));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp->tcp_cached.tcp_flags & TCP_FLAG_ENABLE_NAGLING)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_ag->agg_vars1 |= XSTORM_TOE_AG_CONTEXT_NAGLE_EN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Initialize Send-Una info */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_phys = lm_bd_chain_phys_addr(&tcp->tx_con->bd_chain, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_ag->cmp_bd_cons = 0; /* idx of bd with snd.una - always 0 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_ag->cmp_bd_page_0_to_31 = mem_phys.as_u32.low; /* page that includes the snd.una */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_ag->cmp_bd_page_32_to_63 = mem_phys.as_u32.high; /* page that includes the snd.una */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_ag->cmp_bd_start_seq = tcp->tcp_delegated.send_una; /* the sequence number of the first byte in the bd which holds SndUna */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* more_to_send: The difference between SndNxt and the last byte in the bd pointed by bd prod */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tx_con->bytes_comp_cnt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->tx_con->bytes_comp_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_ag->more_to_send = S32_SUB(tcp->tx_con->bytes_post_cnt,(S32_SUB(tcp->tcp_delegated.send_next,tcp->tcp_delegated.send_una)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((tcp->tx_con->flags & TCP_FIN_REQ_POSTED) && !(tcp->tx_con->flags & TCP_FIN_REQ_COMPLETED)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_ag->more_to_send--; /* the fin byte on the bd chain is not counted */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* xstorm st context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(xctx_st, 0, sizeof(struct xstorm_toe_st_context));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_locate_snd_next_info(tcp->tx_con, tcp->tcp_delegated.send_next, tcp->tcp_delegated.send_una,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &bd_idx, &bd_offset, &mem_phys);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_st->toe.tx_bd_cons = bd_idx; /* index of bd that includes snd_nxt */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_st->toe.tx_bd_offset = bd_offset; /* offset of snd_nxt within its bd */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_st->toe.tx_bd_page_base_hi = mem_phys.as_u32.high;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_st->toe.tx_bd_page_base_lo = mem_phys.as_u32.low;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_st->toe.bd_prod = lm_bd_chain_prod_idx(&tcp->tx_con->bd_chain); /* Bd containing the last byte the application wishes to trasnmit */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_st->toe.driver_doorbell_info_ptr_lo = tcp->tx_con->phys_db_data.as_u32.low;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xctx_st->toe.driver_doorbell_info_ptr_hi = tcp->tx_con->phys_db_data.as_u32.high;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t _lm_tcp_init_ustorm_toe_context(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_context * ctx = (struct toe_context *)tcp->ctx_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ustorm_toe_ag_context *uctx_ag = &ctx->ustorm_ag_context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ustorm_toe_st_context *uctx_st = &ctx->ustorm_st_context.context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t mem_phys = {{0}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Calculate the crc8 for CDU Validation */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(uctx_ag, 0, sizeof(struct ustorm_toe_ag_context));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* ustorm_ag_context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uctx_ag->rq_prod = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uctx_ag->driver_doorbell_info_ptr_hi = tcp->rx_con->phys_db_data.as_u32.high;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uctx_ag->driver_doorbell_info_ptr_lo = tcp->rx_con->phys_db_data.as_u32.low;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* ustorm_st_context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(uctx_st, 0, sizeof(struct ustorm_toe_st_context));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uctx_st->indirection_ram_offset = (u16_t)tcp->tcp_const.hash_value;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uctx_st->pen_grq_placed_bytes = tcp->rx_con->u.rx.gen_info.peninsula_nbytes;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "_lm_tcp_init_ustorm_toe_context: IRO is 0x%x, IS is %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uctx_st->indirection_ram_offset, uctx_st->__indirection_shift);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((tcp->tcp_cached.rcv_indication_size > 0xffff) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->tcp_cached.rcv_indication_size != 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->tcp_cached.rcv_indication_size > 0xffff);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->tcp_cached.rcv_indication_size != 0); /* TBA receive_indication_size != 0 not supported : if it is we need to change initialization below */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* We set the ustorm context to rcv_indication_size = 1 byte, this means that the first packet that is placed on GRQ,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * that exceeds or equals 1 byte is indicated immediately, without arming the push timer, the first packet is identified by
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * a packet that is placed while there are no GRQ placed bytes, every time that the driver advertises 'consumedGRQ', GRQ placed bytes
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * is decreased by the number, bringing it back to '0' will bring us back to the state where the next packet with 1 byte will be indicated.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * We added this feature due to a sparta test called ReceiveIndication, which sends a fairly small packet and expects it to be indicated straight
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * awat, for some reason the small RQ buffer doesn't make it's way to the VBD... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uctx_st->rcv_indication_size = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_phys = lm_bd_chain_phys_addr(&tcp->rx_con->bd_chain, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uctx_st->pen_ring_params.rq_cons = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uctx_st->pen_ring_params.rq_cons_addr_hi = mem_phys.as_u32.high;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uctx_st->pen_ring_params.rq_cons_addr_lo = mem_phys.as_u32.low;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uctx_st->prev_rcv_win_right_edge = tcp->rx_con->db_data.rx->rcv_win_right_edge;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_ignore_grq_push_enabled)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(uctx_st->flags2, USTORM_TOE_ST_CONTEXT_IGNORE_GRQ_PUSH);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_enable_rss == L4_RSS_DYNAMIC)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS( uctx_st->flags2, USTORM_TOE_ST_CONTEXT_RSS_UPDATE_ENABLED );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*DbgMessage(pdev, FATAL, "_lm_tcp_init_ustorm_toe_context(): uctx_st->initial_rcv_wnd=%d\n", tcp->tcp_cached.initial_rcv_wnd);*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uctx_st->initial_rcv_wnd = tcp->tcp_cached.initial_rcv_wnd;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi uctx_st->rcv_nxt = tcp->tcp_delegated.recv_next;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t _lm_tcp_init_cstorm_toe_context(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_context *ctx = (struct toe_context *)tcp->ctx_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct cstorm_toe_ag_context *cctx_ag = &ctx->cstorm_ag_context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct cstorm_toe_st_context *cctx_st = &ctx->cstorm_st_context.context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t mem_phys = {{0}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(cctx_ag, 0, sizeof(struct cstorm_toe_ag_context));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.initial_rcv_wnd > MAX_INITIAL_RCV_WND)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we can't support more than the maximum receive window due to cyclic counters we use for
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * recv_next, recv_win_seq, updates, window increase */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfAll(tcp->tcp_cached.initial_rcv_wnd > MAX_INITIAL_RCV_WND);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* cstorm_ag_context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cctx_ag->bd_prod = lm_bd_chain_prod_idx(&tcp->tx_con->bd_chain); /* Bd containing the last byte the application wishes to trasnmit */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cctx_ag->rel_seq = tcp->tcp_delegated.send_una;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cctx_ag->snd_max = tcp->tcp_delegated.send_max;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* cstorm_st_context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(cctx_st, 0, sizeof(struct cstorm_toe_st_context));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_phys = lm_bd_chain_phys_addr(&tcp->tx_con->bd_chain, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cctx_st->bds_ring_page_base_addr_hi = mem_phys.as_u32.high; /* page that includes the snd.una */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cctx_st->bds_ring_page_base_addr_lo = mem_phys.as_u32.low; /* page that includes the snd.una */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cctx_st->bd_cons = 0; /* idx of bd with snd.una - always 0 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ERR_IF(tcp->tcp_const.hash_value >= (u8_t)USTORM_INDIRECTION_TABLE_SIZE)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_const.hash_value >= (u8_t)USTORM_INDIRECTION_TABLE_SIZE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfAll(tcp->tcp_const.hash_value >= (u8_t)USTORM_INDIRECTION_TABLE_SIZE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_const.hash_value = LM_TOE_FW_RSS_ID(pdev,LM_TOE_BASE_RSS_ID(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cctx_st->prev_snd_max = tcp->tcp_delegated.send_una;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* For TOE RSS the values in the USTORM (RSS) must differ from the one in CSTORM (TSS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 2 options:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi a. base chain.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi b. value of most up-to-date indirection table.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_enable_rss == L4_RSS_DISABLED)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cctx_st->cpu_id = LM_TOE_FW_RSS_ID(pdev,LM_TOE_BASE_RSS_ID(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cctx_st->cpu_id = pdev->toe_info.indirection_table[tcp->tcp_const.hash_value];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cctx_st->free_seq = tcp->tcp_delegated.send_una - 1; /* (snd.una - 1 - offset of snd.una byte in its buffer (which is always 0)) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t _lm_tcp_init_tstorm_toe_context(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_context * ctx = (struct toe_context *)tcp->ctx_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct tstorm_toe_ag_context * tctx_ag = &ctx->tstorm_ag_context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct tstorm_toe_st_context * tctx_st = &ctx->tstorm_st_context.context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* tstorm ag context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(tctx_ag, sizeof(struct tstorm_toe_ag_context));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* tstorm st context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(tctx_st, sizeof(struct tstorm_toe_st_context));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t _lm_tcp_init_timers_context(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_context * ctx = (struct toe_context *)tcp->ctx_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* timers_context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(ctx->timers_context.flags, TIMERS_BLOCK_CONTEXT_CONN_VALID_FLG);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t _lm_tcp_init_toe_context(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = _lm_tcp_init_xstorm_toe_context(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = _lm_tcp_init_ustorm_toe_context(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = _lm_tcp_init_cstorm_toe_context(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = _lm_tcp_init_tstorm_toe_context(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = _lm_tcp_init_timers_context(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* now we need to configure the cdu-validation data */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_cdu_validation_data(pdev, tcp->cid, FALSE /* don't invalidate */);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t _lm_tcp_init_tstorm_tcp_context(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TODO: unify iscsi + toe structure name */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct tstorm_toe_tcp_ag_context_section *ttcp_ag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct tstorm_tcp_st_context_section *ttcp_st;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_ofld_params_t *l4_params = &pdev->ofld_info.l4_params;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_path_state_t *path = tcp->path;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_neigh_state_t *neigh = path->neigh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t sm_rtt, sm_delta;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t snd_wnd;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(sizeof(struct tstorm_toe_tcp_ag_context_section) == sizeof(struct tstorm_tcp_tcp_ag_context_section) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_ag = &((struct toe_context *)tcp->ctx_virt)->tstorm_ag_context.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st = &((struct toe_context *)tcp->ctx_virt)->tstorm_st_context.context.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_ag = (struct tstorm_toe_tcp_ag_context_section *)&((struct iscsi_context *)tcp->ctx_virt)->tstorm_ag_context.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st = &((struct iscsi_context *)tcp->ctx_virt)->tstorm_st_context.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(ttcp_ag, sizeof(struct tstorm_toe_tcp_ag_context_section));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(ttcp_st, sizeof(struct tstorm_tcp_st_context_section));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* tstorm_ag_context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_ag->snd_max = tcp->tcp_delegated.send_max;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_ag->snd_nxt = tcp->tcp_delegated.send_next;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_ag->snd_una = tcp->tcp_delegated.send_una;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* tstorm_st_context*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // starting FW 7.6.5, the DA_EN is a "don't care" for iSCSI as it is set in pf init to FW
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // iSCSI FW overrides this flag according to pf init value regardless context init here.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->flags2 |= TSTORM_TCP_ST_CONTEXT_SECTION_DA_EN; /* DA timer always on */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // DA_COUNTER_EN should stay always on since FW will not use it in case DA_EN is off.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->flags2 |= TSTORM_TCP_ST_CONTEXT_SECTION_DA_COUNTER_EN; /* DA counter always on */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->dup_ack_count = tcp->tcp_delegated.dup_ack_count;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp->tcp_const.tcp_flags & TCP_FLAG_ENABLE_TIME_STAMP) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->flags1 |= TSTORM_TCP_ST_CONTEXT_SECTION_TIMESTAMP_EXISTS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp->tcp_cached.tcp_flags & TCP_FLAG_ENABLE_KEEP_ALIVE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->flags1 |= TSTORM_TCP_ST_CONTEXT_SECTION_KA_ENABLED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((tcp->tcp_cached.ka_time_out == 0) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->tcp_cached.ka_interval == 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->tcp_cached.ka_time_out == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->tcp_cached.ka_interval == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp->tcp_const.tcp_flags & TCP_FLAG_ENABLE_WIN_SCALING) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->snd_wnd_scale = tcp->tcp_const.snd_seg_scale;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->cwnd = tcp->tcp_delegated.send_cwin - tcp->tcp_delegated.send_una; /* i.e. ndis_tcp_delegated->CWnd */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* bugbug: driver workaround - wnd may be 0xffffffff, in this case we change it to 2^30 - since FW has an assumption this value
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * doesn't wrap-around, configuring it to 0xffffffff may cause it to wrap around and then change from a very large cwnd to a ver
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * small one - we give 2^30 which is the largest cwnd that can be advertised. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ttcp_st->cwnd == 0xffffffff) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->cwnd = 0x40000000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->ka_interval =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tcp->tcp_cached.ka_interval, l4_params->ticks_per_second, TIMERS_TICKS_PER_SEC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->ka_max_probe_count = tcp->tcp_cached.ka_probe_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp->tcp_delegated.send_una == tcp->tcp_delegated.send_max) { /* KA is running (?) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->ka_probe_count = tcp->tcp_delegated.u.keep_alive.probe_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else { /* retransmit is running (?) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->ka_probe_count = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->ka_timeout =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tcp->tcp_cached.ka_time_out, l4_params->ticks_per_second, TIMERS_TICKS_PER_SEC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Set the src mac addr in tstorm context:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * In both big and little endian architectures, the mac addr is given from the client in an array of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * 6 chars. Therefore, regardless the endian architectue, we need to swap this array into the little endian
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * convention of the tstorm context. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->msb_mac_address = mm_cpu_to_le16(NTOH16(*(u16 *)(&neigh->neigh_const.src_addr[0])));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->mid_mac_address = mm_cpu_to_le16(NTOH16(*(u16 *)(&neigh->neigh_const.src_addr[2])));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->lsb_mac_address = mm_cpu_to_le16(NTOH16(*(u16 *)(&neigh->neigh_const.src_addr[4])));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->max_rt_time =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tcp->tcp_cached.max_rt, l4_params->ticks_per_second, TSEMI_CLK1_TICKS_PER_SEC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GilR: place holder, to be enabled in v0_18_1 when proper FW support is included */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //ttcp_st->max_seg_retransmit_en = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ttcp_st->max_rt_time == 0) { /* GilR 9/19/2006 - TBD - currently FW does not handle the '0' case correctly. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->max_rt_time = 0xffffffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->flags1 |= TSTORM_TCP_ST_CONTEXT_SECTION_MAX_SEG_RETRANSMIT_EN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //ctx->tstorm_st_context.tcp.max_seg_retransmit_en = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->rx_con->u.rx.sws_info.mss > 0xffff)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->rx_con->u.rx.sws_info.mss > 0xffff);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->mss = tcp->rx_con->u.rx.sws_info.mss & 0xffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we must calc mss here since it is possible that we don't have rx_con (iscsi) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->mss = _lm_tcp_calc_mss(tcp->path->path_cached.path_mtu,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_const.remote_mss,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->path->path_const.ip_version == IP_VERSION_IPV6),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_const.tcp_flags & TCP_FLAG_ENABLE_TIME_STAMP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->ofld_info.l4_params.flags & OFLD_PARAM_FLAG_SNAP_ENCAP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->path->neigh->neigh_const.vlan_tag != 0) & 0xffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* NirV: set expected release sequance parameter that's being set in the toe fw but not in the iscsi fw */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* should be done in the iscsi initiate offload handler in the fw as in toe */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->expected_rel_seq = tcp->tcp_delegated.send_una;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "offload num_retx=%d, snd_wnd_probe_cnt=%d\n",tcp->tcp_delegated.u.retransmit.num_retx,tcp->tcp_delegated.snd_wnd_probe_count);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->persist_probe_count = tcp->tcp_delegated.snd_wnd_probe_count;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->prev_seg_seq = tcp->tcp_delegated.send_wl1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->rcv_nxt = tcp->tcp_delegated.recv_next;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*ttcp_st->reserved_slowpath = 0; This value is the 7 LSBs of the toeplitz hash result for this connection's 4 tuple.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi required in order to give the L2-completion on the correct RSS ring
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi TBD - toeplitz hash calc not implemented for this yet, but no harm done */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //calculate snd window
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snd_wnd = (S32_SUB(tcp->tcp_delegated.send_cwin, tcp->tcp_delegated.send_win) > 0) ?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->tcp_delegated.send_win - tcp->tcp_delegated.send_una) : /* i.e. ndis_tcp_delegated->SndWnd */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->tcp_delegated.send_cwin - tcp->tcp_delegated.send_una); /* i.e. ndis_tcp_delegated->CWnd */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp->tcp_delegated.send_una == tcp->tcp_delegated.send_max && snd_wnd > 0) { /* KA is running (?) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->rto_exp = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->retransmit_count = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else { /* retransmit is running (?) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->retransmit_count = tcp->tcp_delegated.u.retransmit.num_retx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->rto_exp = tcp->tcp_delegated.u.retransmit.num_retx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->retransmit_start_time =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tcp->tcp_delegated.total_rt, l4_params->ticks_per_second, TSEMI_CLK1_TICKS_PER_SEC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* convert to ms.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the /8 and /4 are a result of some shifts that MSFT does, these number were received from MSFT through emails and are
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * done the same in Teton. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sm_rtt = lm_time_resolution(pdev, tcp->tcp_delegated.sm_rtt, l4_params->ticks_per_second, TIMERS_TICKS_PER_SEC)/8;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (sm_rtt > 30000) { /* reduce to 30sec */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sm_rtt = 30000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sm_delta = lm_time_resolution(pdev, tcp->tcp_delegated.sm_delta, l4_params->ticks_per_second, TIMERS_TICKS_PER_SEC)/4;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (sm_delta > 30000) { /* reduce to 30sec */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sm_delta = 30000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->flags1 |= (sm_rtt << TSTORM_TCP_ST_CONTEXT_SECTION_RTT_SRTT_SHIFT); /* given in ticks, no conversion is required */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->flags2 |= (sm_delta << TSTORM_TCP_ST_CONTEXT_SECTION_RTT_VARIATION_SHIFT); /* given in ticks, no conversion is required */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((tcp->ulp_type == TOE_CONNECTION_TYPE) && (tcp->rx_con->flags & TCP_REMOTE_FIN_RECEIVED)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->flags1 |= TSTORM_TCP_ST_CONTEXT_SECTION_STOP_RX_PAYLOAD;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->ss_thresh = tcp->tcp_delegated.ss_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->timestamp_recent = tcp->tcp_delegated.ts_recent;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->timestamp_recent_time =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tcp->tcp_delegated.ts_recent_age, l4_params->ticks_per_second, TSEMI_CLK1_TICKS_PER_SEC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->vlan_id = neigh->neigh_const.vlan_tag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->recent_seg_wnd = tcp->tcp_delegated.send_win - tcp->tcp_delegated.send_una;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->ooo_support_mode = (tcp->ulp_type == TOE_CONNECTION_TYPE)? TCP_TSTORM_OOO_SUPPORTED : TCP_TSTORM_OOO_DROP_AND_PROC_ACK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ttcp_st->statistics_counter_id = (tcp->ulp_type == TOE_CONNECTION_TYPE)? LM_STATS_CNT_ID(pdev) : LM_CLI_IDX_ISCSI;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Set statistics params
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( TOE_CONNECTION_TYPE == tcp->ulp_type )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // set enable L2
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS( ttcp_st->flags2, 1<<TSTORM_TCP_ST_CONTEXT_SECTION_UPDATE_L2_STATSTICS_SHIFT );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // set enable L4
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS( ttcp_st->flags2, 1<<TSTORM_TCP_ST_CONTEXT_SECTION_UPDATE_L4_STATSTICS_SHIFT );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t _lm_tcp_init_xstorm_tcp_context(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TODO: unify iscsi + toe structure name */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct xstorm_toe_tcp_ag_context_section * xtcp_ag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct xstorm_common_context_section * xtcp_st;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_path_state_t * path = tcp->path;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_neigh_state_t * neigh = path->neigh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_ofld_params_t * l4_params = &(pdev->ofld_info.l4_params);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t src_ip[4], dst_ip[4];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t pseudo_cs, i;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t sm_rtt, sm_delta;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(sizeof(struct xstorm_toe_tcp_ag_context_section) == sizeof(struct xstorm_tcp_tcp_ag_context_section));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag = &((struct toe_context *)tcp->ctx_virt)->xstorm_ag_context.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st = &((struct toe_context *)tcp->ctx_virt)->xstorm_st_context.context.common;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag = (struct xstorm_toe_tcp_ag_context_section *)&((struct iscsi_context *)tcp->ctx_virt)->xstorm_ag_context.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st = &((struct iscsi_context *)tcp->ctx_virt)->xstorm_st_context.common;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(xtcp_ag, sizeof(struct xstorm_toe_tcp_ag_context_section));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(xtcp_st, sizeof(struct xstorm_common_context_section));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->ack_to_far_end = tcp->tcp_delegated.recv_next;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp->tcp_delegated.send_una == tcp->tcp_delegated.send_max) { /* KA is running (?) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((tcp->tcp_cached.ka_probe_cnt > 0) && (tcp->tcp_delegated.u.keep_alive.timeout_delta == 0)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->ka_timer = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if ((tcp->tcp_cached.ka_probe_cnt == 0) && (tcp->tcp_delegated.u.keep_alive.timeout_delta == 0)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.ka_time_out == 0) {/* KA disabled */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->ka_timer = 0xffffffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.ka_time_out == 0xffffffff) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->ka_timer = 0xffffffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->ka_timer =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.ka_time_out ?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tcp->tcp_cached.ka_time_out, l4_params->ticks_per_second, TIMERS_TICKS_PER_SEC) :
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 1 /* value of 0 is not allowed by FW */;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_delegated.u.keep_alive.timeout_delta == 0xffffffff) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->ka_timer = 0xffffffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->ka_timer = lm_time_resolution(pdev, tcp->tcp_delegated.u.keep_alive.timeout_delta, l4_params->ticks_per_second, TIMERS_TICKS_PER_SEC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else { /* retransmit is running (?) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->ka_timer = 0xffffffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->local_adv_wnd = tcp->tcp_delegated.recv_win_seq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if (tcp->ulp_type == ISCSI_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* NirV: Add define to the iscsi HSI */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->local_adv_wnd = 0xFFFF << ((u16_t)tcp->tcp_const.rcv_seg_scale & 0xf); /* rcv_seg_scale is only 4b long */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->rx_con->u.rx.sws_info.mss > 0xffff)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->rx_con->u.rx.sws_info.mss > 0xffff);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->mss = tcp->rx_con->u.rx.sws_info.mss & 0xffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we must calc mss here since it is possible that we don't have rx_con (iscsi) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->mss = _lm_tcp_calc_mss(tcp->path->path_cached.path_mtu,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_const.remote_mss,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->path->path_const.ip_version == IP_VERSION_IPV6),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_const.tcp_flags & TCP_FLAG_ENABLE_TIME_STAMP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->ofld_info.l4_params.flags & OFLD_PARAM_FLAG_SNAP_ENCAP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->path->neigh->neigh_const.vlan_tag != 0) & 0xfffc; /* MSS value set in the XStorm should be multiple of 4 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == ISCSI_CONNECTION_TYPE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (xtcp_ag->mss < 4)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(xtcp_ag->mss < 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->mss -= 4; // -4 for data digest
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*if persist probes were sent xstorm should be blocked*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_delegated.snd_wnd_probe_count == 0) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->tcp_agg_vars2 |= __XSTORM_TOE_TCP_AG_CONTEXT_SECTION_TX_UNBLOCKED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* calculate transmission window */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->tx_wnd =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (S32_SUB(tcp->tcp_delegated.send_cwin, tcp->tcp_delegated.send_win) > 0) ?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->tcp_delegated.send_win - tcp->tcp_delegated.send_una) : /* i.e. ndis_tcp_delegated->SndWnd */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->tcp_delegated.send_cwin - tcp->tcp_delegated.send_una); /* i.e. ndis_tcp_delegated->CWnd */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* bugbug: driver workaround - wnd may be 0xffffffff, in this case we change it to 2^30 - since FW has an assumption this value
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * doesn't wrap-around, configuring it to 0xffffffff may cause it to wrap around and then change from a very large cwnd to a ver
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * small one - we give 2^30 which is the largest cwnd that can be advertised. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (xtcp_ag->tx_wnd == 0xffffffff) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->tx_wnd = 0x40000000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check if we are in keepalive. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((tcp->tcp_delegated.send_una == tcp->tcp_delegated.send_max) && ((xtcp_ag->tx_wnd > 0) || (tcp->tcp_delegated.u.retransmit.retx_ms == 0xffffffff))) { /* KA is enabled (?) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* convert to ms.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the /8 and /4 are a result of some shifts that MSFT does, these number were received from MSFT through emails and are
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * done the same in Teton. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sm_rtt = lm_time_resolution(pdev, tcp->tcp_delegated.sm_rtt, l4_params->ticks_per_second, TIMERS_TICKS_PER_SEC)/8;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (sm_rtt > 30000) { /* reduce to 30sec */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sm_rtt = 30000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sm_delta = lm_time_resolution(pdev, tcp->tcp_delegated.sm_delta, l4_params->ticks_per_second, TIMERS_TICKS_PER_SEC)/4;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (sm_delta > 30000) { /* reduce to 30sec */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sm_delta = 30000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->rto_timer = (sm_rtt + (sm_delta << 2));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else { /* retransmit is running (?) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_delegated.u.retransmit.retx_ms == 0xffffffff) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->rto_timer = 0xffffffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->rto_timer = tcp->tcp_delegated.u.retransmit.retx_ms ? tcp->tcp_delegated.u.retransmit.retx_ms : 1 /* value of 0 is not allowed by FW*/;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TODO: retx_ms is already converted in Miniport
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * we need to convert retx_ms to clock ticks in VBD instead of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * doing this conversion in NDIS (same as Teton) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*tcp->tcp_delegated.u.retransmit.retx_ms ?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tcp->tcp_delegated.u.retransmit.retx_ms,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 1000, TIMERS_TICKS_PER_SEC) :
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 1 *//* value of 0 is not allowed by FW*/;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->snd_nxt = tcp->tcp_delegated.send_next;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->snd_una = tcp->tcp_delegated.send_una;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->tcp_agg_vars2 |= XSTORM_TOE_TCP_AG_CONTEXT_SECTION_DA_ENABLE; /* Delayed Acks always on */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_ag->ts_to_echo = tcp->tcp_delegated.ts_recent;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* xstorm_st_context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.remote_addr_0 = neigh->neigh_cached.dst_addr[0];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.remote_addr_1 = neigh->neigh_cached.dst_addr[1];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.remote_addr_2 = neigh->neigh_cached.dst_addr[2];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.remote_addr_3 = neigh->neigh_cached.dst_addr[3];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.remote_addr_4 = neigh->neigh_cached.dst_addr[4];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.remote_addr_5 = neigh->neigh_cached.dst_addr[5];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (neigh->neigh_const.vlan_tag > 0xfff)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(neigh->neigh_const.vlan_tag > 0xfff);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.vlan_params |= (neigh->neigh_const.vlan_tag << XSTORM_ETH_CONTEXT_SECTION_VLAN_ID_SHIFT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.user_priority > 0x7)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->tcp_cached.user_priority > 0x7);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.vlan_params |= (tcp->tcp_cached.user_priority << XSTORM_ETH_CONTEXT_SECTION_PRIORITY_SHIFT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((0 != GET_FLAGS(xtcp_st->ethernet.vlan_params, XSTORM_ETH_CONTEXT_SECTION_VLAN_ID)) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (0 != GET_FLAGS(xtcp_st->ethernet.vlan_params, XSTORM_ETH_CONTEXT_SECTION_CFI)) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (0 != GET_FLAGS(xtcp_st->ethernet.vlan_params, XSTORM_ETH_CONTEXT_SECTION_PRIORITY)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // This fields should be set to 1 whenever an inner VLAN is provided by the OS.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // This flags is relevant for all function modes.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS( xtcp_st->flags, XSTORM_COMMON_CONTEXT_SECTION_VLAN_MODE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.local_addr_0 = neigh->neigh_const.src_addr[0];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.local_addr_1 = neigh->neigh_const.src_addr[1];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.local_addr_2 = neigh->neigh_const.src_addr[2];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.local_addr_3 = neigh->neigh_const.src_addr[3];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.local_addr_4 = neigh->neigh_const.src_addr[4];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.local_addr_5 = neigh->neigh_const.src_addr[5];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ethernet.reserved_vlan_type = 0x8100;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_version_1b = (tcp->path->path_const.ip_version == IP_VERSION_IPV4)? 0 : 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->path->path_const.ip_version == IP_VERSION_IPV4) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* IPv4*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.padded_ip_v4.ip_v4.ip_remote_addr = path->path_const.u.ipv4.dst_ip;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.padded_ip_v4.ip_v4.ip_local_addr = path->path_const.u.ipv4.src_ip;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.padded_ip_v4.ip_v4.tos = tcp->tcp_cached.tos_or_traffic_class;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if DBG
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.padded_ip_v4.ip_v4.ttl = (tcp->ulp_type == TOE_CONNECTION_TYPE) ? TOE_DBG_TTL : ISCSI_DBG_TTL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.padded_ip_v4.ip_v4.ttl = tcp->tcp_cached.ttl_or_hop_limit;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi src_ip[0] = HTON32(path->path_const.u.ipv4.src_ip);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dst_ip[0] = HTON32(path->path_const.u.ipv4.dst_ip);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pseudo_cs = lm_tcp_calc_tcp_pseudo_checksum(pdev, src_ip, dst_ip, IP_VERSION_IPV4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* IPv6*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.ip_v6.ip_remote_addr_lo_lo = path->path_const.u.ipv6.dst_ip[0];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.ip_v6.ip_remote_addr_lo_hi = path->path_const.u.ipv6.dst_ip[1];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.ip_v6.ip_remote_addr_hi_lo = path->path_const.u.ipv6.dst_ip[2];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.ip_v6.ip_remote_addr_hi_hi = path->path_const.u.ipv6.dst_ip[3];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.ip_v6.ip_local_addr_lo_lo = path->path_const.u.ipv6.src_ip[0];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.ip_v6.ip_local_addr_lo_hi = path->path_const.u.ipv6.src_ip[1];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.ip_v6.ip_local_addr_hi_lo = path->path_const.u.ipv6.src_ip[2];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.ip_v6.ip_local_addr_hi_hi = path->path_const.u.ipv6.src_ip[3];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if DBG
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.ip_v6.hop_limit = (tcp->ulp_type == TOE_CONNECTION_TYPE) ? TOE_DBG_TTL : ISCSI_DBG_TTL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.ip_v6.hop_limit = tcp->tcp_cached.ttl_or_hop_limit;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->tcp_cached.flow_label > 0xffff);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->ip_union.ip_v6.priority_flow_label =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.flow_label << XSTORM_IP_V6_CONTEXT_SECTION_FLOW_LABEL_SHIFT |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.tos_or_traffic_class << XSTORM_IP_V6_CONTEXT_SECTION_TRAFFIC_CLASS_SHIFT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < 4; i++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi src_ip[i] = HTON32(path->path_const.u.ipv6.src_ip[i]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dst_ip[i] = HTON32(path->path_const.u.ipv6.dst_ip[i]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pseudo_cs = lm_tcp_calc_tcp_pseudo_checksum(pdev, src_ip, dst_ip, IP_VERSION_IPV6);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->tcp.local_port = tcp->tcp_const.src_port;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->tcp.pseudo_csum = NTOH16(pseudo_cs);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->tcp.remote_port = tcp->tcp_const.dst_port;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->tcp.snd_max = tcp->tcp_delegated.send_max;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp->tcp_const.tcp_flags & TCP_FLAG_ENABLE_TIME_STAMP) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->tcp.ts_enabled = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp->tcp_const.tcp_flags & TCP_FLAG_ENABLE_SACK) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->tcp.tcp_params |= XSTORM_TCP_CONTEXT_SECTION_SACK_ENABLED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((tcp->ulp_type == TOE_CONNECTION_TYPE) && (tcp->tx_con->flags & TCP_FIN_REQ_POSTED)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->tcp.tcp_params |= XSTORM_TCP_CONTEXT_SECTION_FIN_SENT_FLAG;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->tcp.ts_time_diff = tcp->tcp_delegated.tstamp; /* time conversion not required */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->tcp.window_scaling_factor = (u16_t)tcp->tcp_const.rcv_seg_scale & 0xf; /* rcv_seg_scale is only 4b long */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Set statistics params
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( TOE_CONNECTION_TYPE == tcp->ulp_type )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // set counter id
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xtcp_st->tcp.statistics_counter_id = LM_STATS_CNT_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // set enable L2
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS( xtcp_st->tcp.statistics_params, 1<<XSTORM_TCP_CONTEXT_SECTION_UPDATE_L2_STATSTICS_SHIFT );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // set enable L4
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS( xtcp_st->tcp.statistics_params, 1<<XSTORM_TCP_CONTEXT_SECTION_UPDATE_L4_STATSTICS_SHIFT );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == ISCSI_CONNECTION_TYPE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS( xtcp_st->flags,(1 << XSTORM_COMMON_CONTEXT_SECTION_PHYSQ_INITIALIZED_SHIFT ));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS( xtcp_st->flags,(PORT_ID(pdev) << XSTORM_COMMON_CONTEXT_SECTION_PBF_PORT_SHIFT));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* init the content of the toe context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t _lm_tcp_init_tcp_context(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = _lm_tcp_init_xstorm_tcp_context(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = _lm_tcp_init_tstorm_tcp_context(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t _lm_tcp_init_iscsi_tcp_related_context(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct cstorm_iscsi_ag_context * ciscsi_ag = &((struct iscsi_context *)tcp->ctx_virt)->cstorm_ag_context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct cstorm_iscsi_st_context * ciscsi_st = &((struct iscsi_context *)tcp->ctx_virt)->cstorm_st_context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct xstorm_iscsi_ag_context * xiscsi_ag = &((struct iscsi_context *)tcp->ctx_virt)->xstorm_ag_context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct xstorm_iscsi_st_context * xiscsi_st = &((struct iscsi_context *)tcp->ctx_virt)->xstorm_st_context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct tstorm_iscsi_ag_context * tiscsi_ag = &((struct iscsi_context *)tcp->ctx_virt)->tstorm_ag_context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct tstorm_iscsi_st_context * tiscsi_st = &((struct iscsi_context *)tcp->ctx_virt)->tstorm_st_context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(sizeof(struct cstorm_toe_ag_context) == sizeof(struct cstorm_iscsi_ag_context));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// ASSERT_STATIC(sizeof(struct cstorm_toe_st_context) == sizeof(struct cstorm_iscsi_st_context));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// ASSERT_STATIC(OFFSETOF(struct iscsi_context, cstorm_ag_context)== OFFSETOF(struct toe_context, cstorm_ag_context) ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// ASSERT_STATIC(OFFSETOF(struct iscsi_context, cstorm_st_context)== OFFSETOF(struct toe_context, cstorm_st_context) ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* cstorm */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ciscsi_ag->rel_seq = tcp->tcp_delegated.send_next; //pTcpParams->sndNext;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ciscsi_ag->rel_seq_th = tcp->tcp_delegated.send_next; //pTcpParams->sndNext;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ciscsi_st->hq_tcp_seq = tcp->tcp_delegated.send_next; //pTcpParams->sndNext;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* xstorm */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xiscsi_ag->hq_cons_tcp_seq = tcp->tcp_delegated.send_next; //pTcpParams->sndNext;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* tstorm */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* in toe the window right edge is initialized by the doorbell */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* recv_win_seq */ /* recv next */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tiscsi_ag->tcp.wnd_right_edge = (xiscsi_ag->tcp.local_adv_wnd << xiscsi_st->common.tcp.window_scaling_factor) + xiscsi_ag->tcp.ack_to_far_end;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tiscsi_ag->tcp.wnd_right_edge_local = tiscsi_ag->tcp.wnd_right_edge;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tiscsi_st->iscsi.process_nxt = tcp->tcp_delegated.recv_next; // same value as rcv_nxt
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //xAgCtx->mss = pTcpParams->mss - 4; // -4 for data digest
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Allocation of CID for a new TCP connection to be offloaded,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Initiation of connection's context line as required by FW.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - lm_tcp_init_tcp_state, lm_tcp_init_rx_con/tx_con already called
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - send unacked data already posted
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - If the TCP is in states FinWait1, Closing or LastAck,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * FIN is already posted to the tx chain
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - Called under connection lock: since it can be called from either initiate-ofld
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * or recycle-cid (before ofld had the chance to complete)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_init_tcp_context(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s32_t cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_4tuple_t tuple = {{0}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t expect_rwin;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t i;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "##lm_tcp_init_tcp_context\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* NirV: allocate cid is getting back here */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* allocate cid only if cid==0: we may re-enter this function after a cid has already been allocated */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->cid == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_allocate_cid(pdev, TOE_CONNECTION_TYPE, (void*)tcp, &cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(lm_status == LM_STATUS_RESOURCE){
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4sp, "lm_tcp_init_tcp_state: Failed in allocating cid\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if (lm_status == LM_STATUS_PENDING) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sp_req_manager_block(pdev, (u32_t)cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid = (u32_t)cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_cid_state(pdev, tcp->cid) == LM_CID_STATE_PENDING) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS; /* Too soon to initialize context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Validate some of the offload parameters - only relevant for TOE. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.sws_info.extra_bytes = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->rx_con->u.rx.gen_info.peninsula_nbytes > tcp->tcp_cached.initial_rcv_wnd) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.sws_info.extra_bytes = tcp->rx_con->u.rx.gen_info.peninsula_nbytes - tcp->tcp_cached.initial_rcv_wnd;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.sws_info.drv_rcv_win_right_edge = tcp->tcp_delegated.recv_next;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->db_data.rx->rcv_win_right_edge = tcp->tcp_delegated.recv_next;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "lm_tcp_init_tcp_state: pnb:%x, irw:%x, ext:%x, rnx:%x\n",tcp->rx_con->u.rx.gen_info.peninsula_nbytes,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.initial_rcv_wnd,tcp->rx_con->u.rx.sws_info.extra_bytes,tcp->tcp_delegated.recv_next);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi expect_rwin = (u32_t)S32_SUB(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.recv_win_seq,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.recv_next);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi expect_rwin += tcp->rx_con->u.rx.gen_info.peninsula_nbytes;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* WorkAround for LH: fields received at offload should match the equation below,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * In LH it's not the case. TBA: add assert that we are on LH operating system */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "lm_tcp_init_tcp_state: pnb:%x, irw:%x, rws:%x, rnx:%x\n",tcp->rx_con->u.rx.gen_info.peninsula_nbytes,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.initial_rcv_wnd,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.recv_win_seq,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.recv_next);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ERR_IF(expect_rwin != tcp->tcp_cached.initial_rcv_wnd)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t delta;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* move tcp_delegated.recv_next accordingly */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (expect_rwin > tcp->tcp_cached.initial_rcv_wnd) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi delta = expect_rwin - tcp->tcp_cached.initial_rcv_wnd;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.recv_win_seq -= delta;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi delta = tcp->tcp_cached.initial_rcv_wnd - expect_rwin;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.recv_win_seq += delta;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Need to also update the driver win right edge */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->db_data.rx->rcv_win_right_edge = tcp->tcp_delegated.recv_win_seq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.sws_info.drv_rcv_win_right_edge = tcp->tcp_delegated.recv_win_seq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* insert 4 tuple to searcher's mirror hash */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp->path->path_const.ip_version == IP_VERSION_IPV4) { /* IPV4 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tuple.ip_type = LM_IP_TYPE_V4;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tuple.dst_ip[0] = tcp->path->path_const.u.ipv4.dst_ip;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tuple.src_ip[0] = tcp->path->path_const.u.ipv4.src_ip;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tuple.ip_type = LM_IP_TYPE_V6;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < 4; i++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tuple.dst_ip[i] = tcp->path->path_const.u.ipv6.dst_ip[i];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tuple.src_ip[i] = tcp->path->path_const.u.ipv6.src_ip[i];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tuple.src_port = tcp->tcp_const.src_port;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tuple.dst_port = tcp->tcp_const.dst_port;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_searcher_mirror_hash_insert(pdev, tcp->cid, &tuple) != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4sp, "lm_tcp_init_tcp_context: Failed inserting tuple to SRC hash\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->in_searcher = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->in_searcher = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* get context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->ctx_virt = (struct toe_context *)lm_get_context(pdev, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!tcp->ctx_virt) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!tcp->ctx_virt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->ctx_phys.as_u64 = lm_get_context_phys(pdev, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!tcp->ctx_phys.as_u64) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!tcp->ctx_phys.as_u64);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "tcp->ctx_virt=%p, tcp->ctx_phys_high=%x, tcp->ctx_phys_low=%x\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->ctx_virt, tcp->ctx_phys.as_u32.high, tcp->ctx_phys.as_u32.low);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* init the content of the context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = _lm_tcp_init_toe_context(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = _lm_tcp_init_tcp_context(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* iscsi / toe contexts are initialized separately, only the tcp section is common, HOWEVER, in iscsi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * most of the context is initialized in the l5_ofld_stage, but some of the context initialization is based on tcp
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * params, that's why we need to complete it here... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == ISCSI_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = _lm_tcp_init_iscsi_tcp_related_context(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/** Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Callback function for cids being recylced
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_recycle_cid_cb(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void *cookie,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s32_t cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp = (lm_tcp_state_t *)cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sp_req_common_t *sp_req = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* un-block the manager... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_cid_state(pdev, tcp->cid, LM_CID_STATE_VALID);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* if the ofld flow got to the ofld workitem, only now set we can use the context,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi other wise, we'll get to the init_tcp_context later on */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->hdr.status == STATE_STATUS_INIT_CONTEXT)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_init_tcp_context(pdev,tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we can now unblock any pending slow-paths */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sp_req_manager_unblock(pdev,cid, &sp_req);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* This function needs to complete a pending slowpath toe request. Unfortunatelly it needs
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to take care of all the steps done in lm_toe_service_rx_intr and lm_toe_service_tx_intr,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * process the cqe, and complete slowpath...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_comp_cb(struct _lm_device_t *pdev, struct sq_pending_command *pending)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * rx_con = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * tx_con = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_rx_cqe rx_cqe = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_tx_cqe tx_cqe = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t cmp_rx = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t cmp_tx = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp = lm_cid_cookie(pdev, TOE_CONNECTION_TYPE, pending->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Possible the tcp is NULL for ramrods that are context-less (RSS for example) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #define LM_TCP_SET_CQE(_param, _cid, _cmd) \
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (_param) = (((_cid) << TOE_RX_CQE_CID_SHIFT) & TOE_RX_CQE_CID) | \
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (((_cmd) << TOE_RX_CQE_COMPLETION_OPCODE_SHIFT) & TOE_RX_CQE_COMPLETION_OPCODE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (pending->cmd)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_OPCODE_TOE_INIT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("Not Supported\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_OPCODE_TOE_INITIATE_OFFLOAD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TCP_SET_CQE(rx_cqe.params1, pending->cid, RAMROD_OPCODE_TOE_INITIATE_OFFLOAD);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmp_rx = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_OPCODE_TOE_SEARCHER_DELETE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TCP_SET_CQE(rx_cqe.params1, pending->cid, RAMROD_OPCODE_TOE_SEARCHER_DELETE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmp_rx = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_OPCODE_TOE_TERMINATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Completion may have completed on tx / rx only, so whether or not to complete it depends not
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * only on type but on state of sp_request as well... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TCP_SET_CQE(rx_cqe.params1, pending->cid, RAMROD_OPCODE_TOE_TERMINATE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmp_rx = (GET_FLAGS(tcp->sp_flags, SP_REQUEST_COMPLETED_RX) == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TCP_SET_CQE(tx_cqe.params, pending->cid, RAMROD_OPCODE_TOE_TERMINATE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmp_tx = (GET_FLAGS(tcp->sp_flags, SP_REQUEST_COMPLETED_TX) == 0);;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_OPCODE_TOE_QUERY:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TCP_SET_CQE(rx_cqe.params1, pending->cid, RAMROD_OPCODE_TOE_QUERY);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmp_rx = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_OPCODE_TOE_RESET_SEND:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TCP_SET_CQE(rx_cqe.params1, pending->cid, RAMROD_OPCODE_TOE_RESET_SEND);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmp_rx = (GET_FLAGS(tcp->sp_flags, SP_REQUEST_COMPLETED_RX) == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TCP_SET_CQE(tx_cqe.params, pending->cid, RAMROD_OPCODE_TOE_RESET_SEND);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmp_tx = (GET_FLAGS(tcp->sp_flags, SP_REQUEST_COMPLETED_TX) == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_OPCODE_TOE_EMPTY_RAMROD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TCP_SET_CQE(rx_cqe.params1, pending->cid, RAMROD_OPCODE_TOE_EMPTY_RAMROD);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmp_rx = (GET_FLAGS(tcp->sp_flags, SP_REQUEST_COMPLETED_RX) == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TCP_SET_CQE(tx_cqe.params, pending->cid, RAMROD_OPCODE_TOE_EMPTY_RAMROD);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmp_tx = (GET_FLAGS(tcp->sp_flags, SP_REQUEST_COMPLETED_TX) == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_OPCODE_TOE_INVALIDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TCP_SET_CQE(rx_cqe.params1, pending->cid, RAMROD_OPCODE_TOE_INVALIDATE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmp_rx = (GET_FLAGS(tcp->sp_flags, SP_REQUEST_COMPLETED_RX) == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TCP_SET_CQE(tx_cqe.params, pending->cid, RAMROD_OPCODE_TOE_INVALIDATE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmp_tx = (GET_FLAGS(tcp->sp_flags, SP_REQUEST_COMPLETED_TX) == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_OPCODE_TOE_UPDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TCP_SET_CQE(rx_cqe.params1, pending->cid, RAMROD_OPCODE_TOE_UPDATE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmp_rx = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_OPCODE_TOE_RSS_UPDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This one is special, its not treated as other ramrods, we return and not break
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * at the end of this one... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* a bit of a hack here... we only want to give one completion and not on all
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * rcq-chains, so we update the counters and decrease all l4 rss chains
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * except one. then we give the completion to just one chain which should take care
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * of completing the sq and if L2 ramrod has completed already it will also comp
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * back to OS */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < pdev->params.l4_rss_chain_cnt-1; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_dec(&pdev->params.update_toe_comp_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_dec(&pdev->params.update_comp_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_dec(&pdev->params.update_suspend_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rss_update_ramrod_comp(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->toe_info.rcqs[LM_TOE_BASE_RSS_ID(pdev)],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pending->cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi TOE_RSS_UPD_QUIET /* doesn't really matter*/,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* process the cqes and initialize connections with all the connections that appeared
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * in the DPC */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cmp_rx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_process_cqe(pdev, &rx_cqe, tcp, 0 /* d/c for slpowpath */);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* FP: no need to call complete_tcp_fp since we're only completing slowpath, but we do
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * need to move the flags for sake of next function */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->dpc_info.snapshot_flags = rx_con->dpc_info.dpc_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->dpc_info.dpc_flags = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we access snapshot and not dpc, since once the dpc_flags were copied
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to snapshot they were zeroized */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_complete_tcp_sp(pdev, tcp, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* process the cqes and initialize connections with all the connections that appeared
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * in the DPC */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cmp_tx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_tx_process_cqe(pdev, &tx_cqe, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* FP: no need to call complete_tcp_fp since we're only completing slowpath, but we do
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * need to move the flags for sake of next function */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->dpc_info.snapshot_flags = tx_con->dpc_info.dpc_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->dpc_info.dpc_flags = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we access snapshot and not dpc, since once the dpc_flags were copied
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to snapshot they were zeroized */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_tx_complete_tcp_sp(pdev, tcp, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - init TCP state according to its TCP state machine's state
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - lm_tcp_init_tcp_state, lm_tcp_init_rx_con/tx_con already called
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - send unacked data already posted
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_init_tcp_state_machine(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t *con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_calculation_t *state_calc = &tcp->tcp_state_calc;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u64_t curr_time = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "##lm_tcp_init_tcp_state_machine\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* initiate times in the state calculation struct
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi according to delegated.con_state */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_calc->fin_request_time = state_calc->fin_completed_time =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_calc->fin_reception_time = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi curr_time = mm_get_current_time(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (tcp->tcp_delegated.con_state) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case L4_TCP_CON_STATE_ESTABLISHED:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case L4_TCP_CON_STATE_FIN_WAIT1:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4sp, "#tcp state offloaded in state FIN_WAIT1 (tcp=%p)\n", tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_calc->fin_request_time = curr_time;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case L4_TCP_CON_STATE_FIN_WAIT2:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4sp, "#tcp state offloaded in state FIN_WAIT2 (tcp=%p)\n", tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_calc->fin_request_time = curr_time - 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_calc->fin_completed_time = curr_time;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case L4_TCP_CON_STATE_CLOSE_WAIT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4sp, "#tcp state offloaded in state CLOSE_WAIT (tcp=%p)\n", tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_calc->fin_reception_time = curr_time;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case L4_TCP_CON_STATE_CLOSING:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4sp, "#tcp state offloaded in state CLOSING (tcp=%p)\n", tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_calc->fin_request_time = curr_time - 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_calc->fin_reception_time = curr_time;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case L4_TCP_CON_STATE_LAST_ACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4sp, "#tcp state offloaded in state LAST_ACK (tcp=%p)\n", tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_calc->fin_reception_time = curr_time - 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_calc->fin_request_time = curr_time;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "Initiate offload in con state=%d is not allowed by WDK!\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.con_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* In case the the TCP state is CloseWait, Closing or LastAck, the Rx con
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * should be initiated as if remote FIN was already received */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (state_calc->fin_reception_time) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* remote FIN was already received */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(con->flags & TCP_REMOTE_FIN_RECEIVED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags |= TCP_REMOTE_FIN_RECEIVED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->flags & TCP_INDICATE_REJECTED) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GilR: TODO - is this case really possible [fin received+buffered data given]? If so, does NDIS really expect the fin received indication? */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* buffered data exists, defer FIN indication */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->u.rx.flags |= TCP_CON_FIN_IND_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* no buffered data, simulate that remote FIN already indicated */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags |= TCP_REMOTE_FIN_RECEIVED_ALL_RX_INDICATED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags |= TCP_BUFFERS_ABORTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check if local FIN was already sent, and if it was acknowledged */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (state_calc->fin_completed_time) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* FIN already sent and acked */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi volatile struct toe_tx_db_data *db_data = con->db_data.tx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!state_calc->fin_request_time);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!s_list_is_empty(&con->active_tb_list));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags |= (TCP_FIN_REQ_POSTED | TCP_FIN_REQ_COMPLETED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi db_data->flags |= (TOE_TX_DB_DATA_FIN << TOE_TX_DB_DATA_FIN_SHIFT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi db_data->bytes_prod_seq--;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if (state_calc->fin_request_time) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* FIN was already sent but not acked */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GilR 11/12/2006 - TODO - we do not take the tx lock here, verify that its ok... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* We want to make sure we'll be able to post the tcp buffer but
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * NOT ring the doorbell */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(con->flags & TCP_DB_BLOCKED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags |= TCP_DB_BLOCKED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(con->flags & TCP_POST_BLOCKED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags &= ~TCP_POST_BLOCKED; /* posting is temporary allowed */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->u.tx.flags |= TCP_CON_FIN_REQ_LM_INTERNAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_graceful_disconnect(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* retrieve initial state */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags &= ~TCP_DB_BLOCKED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags |= TCP_POST_BLOCKED; /* posting is no longer allowed*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - call lm_tcp_init_tcp_state_machine
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - call lm_tcp_init_tcp_context
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - lm_tcp_init_tcp_state, lm_tcp_init_rx_con/tx_con already called
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - send unacked data already posted
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_init_tcp_common(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "###lm_tcp_init_tcp_common\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(pdev && tcp));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_init_tcp_state_machine(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_init_tcp_context(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.gen_info.dont_send_to_system_more_then_rwin = FALSE; //TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_tcp_comp_upload_neigh_request(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_neigh_state_t * neigh_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(neigh_state->hdr.status != STATE_STATUS_UPLOAD_PENDING);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(neigh_state->hdr.state_id != STATE_ID_NEIGH);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(neigh_state->num_dependents);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh_state->hdr.status = STATE_STATUS_UPLOAD_DONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_complete_neigh_upload_request(pdev, neigh_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/** Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * upload path state
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * called under TOE-lock
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_tcp_comp_upload_path_request(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_path_state_t * path_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_neigh_state_t * neigh = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(path_state->hdr.status != STATE_STATUS_UPLOAD_PENDING);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(path_state->hdr.state_id != STATE_ID_PATH);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path_state->hdr.status = STATE_STATUS_UPLOAD_DONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(path_state->neigh->num_dependents == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path_state->neigh->num_dependents--;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((path_state->neigh->num_dependents == 0) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (path_state->neigh->hdr.status == STATE_STATUS_UPLOAD_PENDING)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Time to release the neighbor resources...*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh = path_state->neigh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path_state->neigh = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(path_state->num_dependents);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_complete_path_upload_request(pdev, path_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (neigh) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_tcp_comp_upload_neigh_request(pdev, neigh);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* post initiate offload slow path ramrod
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * returns SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_post_initiate_offload_request(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t *command,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u64_t *data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t *con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "##lm_tcp_post_initiate_offload_request\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.status != STATE_STATUS_INIT_CONTEXT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.status = STATE_STATUS_OFFLOAD_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < 2; i++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(con->flags & TCP_POST_BLOCKED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(con->flags & TCP_COMP_BLOCKED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags &= ~TCP_COMP_BLOCKED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags |= TCP_COMP_DEFERRED; /* completions are now allowed but deferred */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags |= SP_TCP_OFLD_REQ_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *command = (tcp->ulp_type == TOE_CONNECTION_TYPE)? RAMROD_OPCODE_TOE_INITIATE_OFFLOAD : L5CM_RAMROD_CMD_ID_ADD_NEW_CONNECTION;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *data = tcp->ctx_phys.as_u64;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_post_terminate_tcp_request (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u8_t * command,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u64_t * data
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "## lm_tcp_post_terminate_tcp_request\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.status != STATE_STATUS_UPLOAD_PENDING);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_flush_db(pdev,tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(tcp->sp_flags, SP_TCP_TRM_REQ_POSTED );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *command = (tcp->ulp_type == TOE_CONNECTION_TYPE)? RAMROD_OPCODE_TOE_TERMINATE : L5CM_RAMROD_CMD_ID_TERMINATE_OFFLOAD;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *data = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Posts RST request.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - Global TOE lock is already taken by the caller.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_post_abortive_disconnect_request (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u8_t * command,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u64_t * data
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get Rx and Tx connections */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t *rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t *tx_con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "## lm_tcp_post_abortive_disconnect_request\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( (tcp->hdr.status != STATE_STATUS_NORMAL ) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->hdr.status != STATE_STATUS_ABORTED) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*********************** Tx **********************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Take Tx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This will imply Tx POST_BLOCKED */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->flags |= TCP_RST_REQ_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release Tx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*********************** Rx **********************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Take Rx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This will imply Rx POST_BLOCKED and IND_BLOCKED */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->flags |= TCP_RST_REQ_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release Rx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**************Post the ramrod *******************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *command = RAMROD_OPCODE_TOE_RESET_SEND;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *data = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Initiates the TCP connection upload process.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Posts a Searcher ramrod to the chip.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - Global TOE lock is already taken by the caller.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - UM caller has allocated "struct toe_context" phys. cont. buffer
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and put its address to "data.phys_addr".
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_post_upload_tcp_request (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u8_t * command,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u64_t * data
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t *rx_con, *tx_con = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_spe spe = {{0}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "## lm_tcp_post_upload_tcp_request\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.status < STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.status >= STATE_STATUS_UPLOAD_PENDING);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.state_id != STATE_ID_TCP);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Set the status of the connection to UPLOAD_PENDING */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.status = STATE_STATUS_UPLOAD_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get Rx and Tx connections */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Set the flags for the connections (Rx and Tx) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Tx */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tx_con->flags & TCP_TRM_REQ_POSTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->flags |= TCP_TRM_REQ_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Rx */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(rx_con->flags & TCP_TRM_REQ_POSTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->flags |= TCP_TRM_REQ_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags |= SP_TCP_SRC_REQ_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *command = (tcp->ulp_type == TOE_CONNECTION_TYPE)? RAMROD_OPCODE_TOE_SEARCHER_DELETE : L5CM_RAMROD_CMD_ID_SEARCHER_DELETE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi spe.toe_data.rx_completion.hash_value = (u16_t)(tcp->tcp_const.hash_value);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *data = *((u64_t*)(&(spe.toe_data.rx_completion)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_post_query_request (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u8_t * command,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u64_t * data,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_slow_path_request_t * request
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_spe spe = {{0}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(request);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "## lm_tcp_post_query_request\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags |= SP_TCP_QRY_REQ_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *command = (tcp->ulp_type == TOE_CONNECTION_TYPE)? RAMROD_OPCODE_TOE_QUERY : L5CM_RAMROD_CMD_ID_QUERY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(tcp->sp_req_data.virt_addr, 0, TOE_SP_PHYS_DATA_SIZE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi spe.toe_data.phys_addr.hi = tcp->sp_req_data.phys_addr.as_u32.high;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi spe.toe_data.phys_addr.lo = tcp->sp_req_data.phys_addr.as_u32.low;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *data = *((u64_t*)(&(spe.toe_data.phys_addr)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_post_upload_path_request (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_path_state_t * path_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_path_delegated_state_t * ret_delegated)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(path_state->hdr.status != STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(path_state->hdr.state_id != STATE_ID_PATH);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* MichalS TBA: do we need this? (also in spec ('ipv4_current_ip_id' unclear)) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *ret_delegated = path_state->path_delegated;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "lm_tcp_post_upload_path_request: num_dependents=%d\n", path_state->num_dependents);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (path_state->num_dependents == 0) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path_state->hdr.status = STATE_STATUS_UPLOAD_DONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path_state->hdr.status = STATE_STATUS_UPLOAD_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_post_upload_neigh_request(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_neigh_state_t * neigh_state
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(neigh_state->hdr.status != STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(neigh_state->hdr.state_id != STATE_ID_NEIGH);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "lm_tcp_post_upload_neigh_request: num_dependents=%d\n", neigh_state->num_dependents);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #if DBG
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* NirV: multi client todo */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_path_state_t * path = (lm_path_state_t *) d_list_peek_head(&pdev->toe_info.state_blk.path_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while(path) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(path->neigh == neigh_state) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(path->hdr.status == STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path = (lm_path_state_t *) d_list_next_entry(&path->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (neigh_state->num_dependents == 0) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh_state->hdr.status = STATE_STATUS_UPLOAD_DONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh_state->hdr.status = STATE_STATUS_UPLOAD_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* sets the cached parameters of tcp/path/neigh and initializes a toe_context (which is initially all zeros) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_set_tcp_cached(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_tcp_cached_state_t * tcp_cached,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * mem_virt /* firmware context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_update_ramrod_cached_params * ctx = mem_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_ofld_params_t * l4_params = &(pdev->ofld_info.l4_params);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* tcp-flags */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## lm_tcp_set_tcp_cached cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((tcp->tcp_cached.tcp_flags & TCP_FLAG_ENABLE_KEEP_ALIVE) !=
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp_cached->tcp_flags & TCP_FLAG_ENABLE_KEEP_ALIVE)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp_cached->tcp_flags & TCP_FLAG_ENABLE_KEEP_ALIVE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->enable_keepalive = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->enable_keepalive = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_ENABLE_KEEPALIVE_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached: [cid=%d] update : flag TCP_FLAG_ENABLE_KEEP_ALIVE changed to %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, ctx->enable_keepalive);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((tcp->tcp_cached.tcp_flags & TCP_FLAG_ENABLE_NAGLING) !=
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp_cached->tcp_flags & TCP_FLAG_ENABLE_NAGLING)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp_cached->tcp_flags & TCP_FLAG_ENABLE_NAGLING) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->enable_nagle = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->enable_nagle = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_ENABLE_NAGLE_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : flag TCP_FLAG_ENABLE_NAGLING changed to %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, ctx->enable_nagle);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp_cached->tcp_flags & TCP_FLAG_RESTART_KEEP_ALIVE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->ka_restart = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : flag TCP_FLAG_RESTART_KEEP_ALIVE set\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->ka_restart = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp_cached->tcp_flags & TCP_FLAG_RESTART_MAX_RT) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->retransmit_restart = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : flag TOE_CACHED_RESTART_MAX_RT set\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->retransmit_restart = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp_cached->tcp_flags & TCP_FLAG_UPDATE_RCV_WINDOW) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* for debugging purposes */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : flag TCP_FLAG_UPDATE_RCV_WINDOW set\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.tcp_flags = tcp_cached->tcp_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* flow label ipv6 only */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->path->path_const.ip_version == IP_VERSION_IPV6) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.flow_label != tcp_cached->flow_label) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : flow_label changed from %d to %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, tcp->tcp_cached.flow_label, tcp_cached->flow_label);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.flow_label = tcp_cached->flow_label;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->flow_label= tcp->tcp_cached.flow_label;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_FLOW_LABEL_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* initial_rcv_wnd */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.initial_rcv_wnd != tcp_cached->initial_rcv_wnd) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : initial_rcv_wnd changed from %d to %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, tcp->tcp_cached.initial_rcv_wnd, tcp_cached->initial_rcv_wnd);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* no change to firmware */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_update_required_gen_bufs(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.sws_info.mss, /* new-mss(no change)*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.sws_info.mss, /* old-mss*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_cached->initial_rcv_wnd, /* new initial receive window */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.initial_rcv_wnd); /* old initial receive window */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* In VISTA and higher, window CAN decrease! */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ERR_IF(tcp_cached->initial_rcv_wnd > MAX_INITIAL_RCV_WND) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TBD: Miniport doesn't handle any parameter other than SUCCESS / PENDING... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TODO: return LM_STATUS_INVALID_PARAMETER; */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfAll(tcp_cached->initial_rcv_wnd > MAX_INITIAL_RCV_WND);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* update the sws_bytea accordingly */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev,tcp->rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* it's now time to give the window doorbell in-case there was a window update - could be negative, in which case, special handling is required... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.initial_rcv_wnd < tcp_cached->initial_rcv_wnd) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* regular window update */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_post_sws(pdev, tcp, tcp->rx_con, tcp_cached->initial_rcv_wnd - tcp->tcp_cached.initial_rcv_wnd, TCP_RX_POST_SWS_INC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_post_sws(pdev, tcp, tcp->rx_con, tcp->tcp_cached.initial_rcv_wnd - tcp_cached->initial_rcv_wnd, TCP_RX_POST_SWS_DEC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.toe_events |= LM_TOE_EVENT_WINDOW_DECREASE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tcp->rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.initial_rcv_wnd = tcp_cached->initial_rcv_wnd;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->initial_rcv_wnd = tcp->tcp_cached.initial_rcv_wnd;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_INITIAL_RCV_WND_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*ttl_or_hop_limit*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.ttl_or_hop_limit != tcp_cached->ttl_or_hop_limit) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : ttl_or_hop_limit changed from %d to %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, tcp->tcp_cached.ttl_or_hop_limit, tcp_cached->ttl_or_hop_limit);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.ttl_or_hop_limit = tcp_cached->ttl_or_hop_limit;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->path->path_const.ip_version == IP_VERSION_IPV4) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->ttl= tcp->tcp_cached.ttl_or_hop_limit;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_TTL_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->hop_limit = tcp->tcp_cached.ttl_or_hop_limit;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_HOP_LIMIT_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* tos_or_traffic_class */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.tos_or_traffic_class != tcp_cached->tos_or_traffic_class) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : tos_or_traffic_class changed from %d to %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, tcp->tcp_cached.tos_or_traffic_class, tcp_cached->tos_or_traffic_class);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.tos_or_traffic_class = tcp_cached->tos_or_traffic_class;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->path->path_const.ip_version == IP_VERSION_IPV4) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->tos = tcp_cached->tos_or_traffic_class;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_TOS_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->traffic_class = tcp_cached->tos_or_traffic_class;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_TRAFFIC_CLASS_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* ka_probe_cnt */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.ka_probe_cnt != tcp_cached->ka_probe_cnt) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : ka_probe_cnt changed from %d to %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, tcp->tcp_cached.ka_probe_cnt, tcp_cached->ka_probe_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.ka_probe_cnt = tcp_cached->ka_probe_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->ka_max_probe_count = tcp_cached->ka_probe_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_KA_MAX_PROBE_COUNT_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* user_priority */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.user_priority != tcp_cached->user_priority) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : user_priority changed from %d to %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, tcp->tcp_cached.user_priority, tcp_cached->user_priority);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp_cached->user_priority > 0x7);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.user_priority = tcp_cached->user_priority;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->user_priority = tcp_cached->user_priority;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_USER_PRIORITY_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* rcv_indication_size */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp_cached->rcv_indication_size != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.rcv_indication_size != tcp_cached->rcv_indication_size) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : rcv_indication_size changed from %d to %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, tcp->tcp_cached.rcv_indication_size, tcp_cached->rcv_indication_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->tcp_cached.rcv_indication_size > 0xffff);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.rcv_indication_size = tcp_cached->rcv_indication_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->rcv_indication_size = (u16_t)tcp_cached->rcv_indication_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_RCV_INDICATION_SIZE_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* ka_time_out */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.ka_time_out != tcp_cached->ka_time_out) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : ka_time_out changed from %d to %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, tcp->tcp_cached.ka_time_out, tcp_cached->ka_time_out);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.ka_time_out = tcp_cached->ka_time_out;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->ka_timeout =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tcp->tcp_cached.ka_time_out, l4_params->ticks_per_second, TIMERS_TICKS_PER_SEC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_KA_TIMEOUT_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* ka_interval */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.ka_interval != tcp_cached->ka_interval) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : ka_interval changed from %d to %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, tcp->tcp_cached.ka_interval, tcp_cached->ka_interval);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.ka_interval = tcp_cached->ka_interval;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->ka_interval =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tcp->tcp_cached.ka_interval, l4_params->ticks_per_second, TIMERS_TICKS_PER_SEC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_KA_INTERVAL_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* max_rt */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_cached.max_rt != tcp_cached->max_rt) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : max_rt changed from %d to %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, tcp->tcp_cached.max_rt, tcp_cached->max_rt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.max_rt = tcp_cached->max_rt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->max_rt =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tcp->tcp_cached.max_rt, l4_params->ticks_per_second, TSEMI_CLK1_TICKS_PER_SEC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_MAX_RT_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!ctx->changed_fields && !ctx->ka_restart && !ctx->retransmit_restart) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## tcp_cached [cid=%d] update : nothing changed, completing synchronously\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS; /* synchronous complete */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //DbgMessage(pdev, WARNl4sp, "## lm_tcp_set_tcp_cached cid=%d DONE!\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* sets the cached parameters of tcp/path/neigh and initializes a toe_context (which is initially all zeros) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_set_path_cached(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_path_cached_state_t * path_cached,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * mem_virt /* firmware context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_update_ramrod_cached_params * ctx = mem_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t new_mss = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi new_mss = _lm_tcp_calc_mss(path_cached->path_mtu,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_const.remote_mss,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->path->path_const.ip_version == IP_VERSION_IPV6),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_const.tcp_flags & TCP_FLAG_ENABLE_TIME_STAMP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->ofld_info.l4_params.flags & OFLD_PARAM_FLAG_SNAP_ENCAP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->path->neigh->neigh_const.vlan_tag != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (new_mss != tcp->rx_con->u.rx.sws_info.mss) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* also need to notify um, since this may affect the number of generic buffers
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * required. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## path_cached: tcp [cid=%d] update : mss (as a result of pathMtu) from %d to %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, tcp->rx_con->u.rx.sws_info.mss, new_mss);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_update_required_gen_bufs(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi new_mss,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.sws_info.mss, /* old-mss*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.initial_rcv_wnd, /* new initial receive window */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_cached.initial_rcv_wnd); /* old initial receive window */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.sws_info.mss = new_mss;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(new_mss > 0xffff);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->mss = (u16_t)new_mss;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_MSS_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ctx->changed_fields == 0) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS; /* synchronous complete */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* sets the cached parameters of tcp/path/neigh and initializes a toe_context (which is initially all zeros)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumption: this function is only called if in-fact, the destination address changed.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_set_neigh_cached(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_neigh_cached_state_t * neigh_cached,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * mem_virt /* firmware context */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_update_ramrod_cached_params * ctx = mem_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## neigh_cached: tcp [cid=%d] update : neighbor dst_addr\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < 6; i++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->dest_addr[i] = (u8_t)neigh_cached->dst_addr[i]; /* TBA Michals : is this init correct? order of assignment*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ctx->changed_fields |= TOE_UPDATE_RAMROD_CACHED_PARAMS_DEST_ADDR_CHANGED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_post_update_request (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u8_t * command,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u64_t * data,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_slow_path_request_t * request
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_spe spe = {{0}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.state_id != STATE_ID_TCP);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *command = RAMROD_OPCODE_TOE_UPDATE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi spe.toe_data.phys_addr.hi = tcp->sp_req_data.phys_addr.as_u32.high;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi spe.toe_data.phys_addr.lo = tcp->sp_req_data.phys_addr.as_u32.low;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *data = *((u64_t*)(&(spe.toe_data.phys_addr)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(tcp->sp_req_data.virt_addr, 0, sizeof(struct toe_update_ramrod_cached_params));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((tcp->hdr.status != STATE_STATUS_NORMAL) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->hdr.status != STATE_STATUS_ABORTED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we need to initialize the data for firmware */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(request->type) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_TCP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_set_tcp_cached(pdev, tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi request->sent_data.tcp_update_data.data,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_req_data.virt_addr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_PATH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->path->hdr.status != STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->path->neigh->hdr.status != STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_set_path_cached(pdev, tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi request->sent_data.tcp_update_data.data,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_req_data.virt_addr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_NEIGH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->path->neigh->hdr.status != STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_set_neigh_cached(pdev, tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi request->sent_data.tcp_update_data.data,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_req_data.virt_addr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_PATH_RELINK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we will always return PENDING status */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->path->neigh->hdr.status != STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_set_neigh_cached(pdev, tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &((lm_tcp_path_relink_cached_t *)request->sent_data.tcp_update_data.data)->neigh_cached,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_req_data.virt_addr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->path->hdr.status != STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->path->neigh->hdr.status != STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_set_path_cached(pdev, tcp, &((lm_tcp_path_relink_cached_t *)request->sent_data.tcp_update_data.data)->path_cached,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_req_data.virt_addr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_post_empty_ramrod_request(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u8_t * command,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u64_t * data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_spe spe = {{0}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "## lm_tcp_post_empty_ramrod_request\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *command = RAMROD_OPCODE_TOE_EMPTY_RAMROD;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi spe.toe_data.rx_completion.hash_value = (u16_t)(tcp->tcp_const.hash_value);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *data = *((u64_t*)(&(spe.toe_data.rx_completion)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_tcp_post_invalidate_request(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u8_t * command,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT u64_t * data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get Rx and Tx connections */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * tx_con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "## lm_tcp_post_invalidate_request cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.status != STATE_STATUS_NORMAL &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.status != STATE_STATUS_ABORTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Set the flags for the connections (Rx and Tx) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Tx */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tx_con->flags & TCP_INV_REQ_POSTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->flags |= TCP_INV_REQ_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Rx */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(rx_con->flags & TCP_INV_REQ_POSTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->flags |= TCP_INV_REQ_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *command = RAMROD_OPCODE_TOE_INVALIDATE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *data = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * post slow path request of given type for given tcp state
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - caller initialized request->type according to his specific request
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - caller allocated space for request->data, according to the specific request type
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - all previous slow path requests for given tcp state are already completed
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * PENDING, SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_post_slow_path_request(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_slow_path_request_t *request)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u64_t data = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t command = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(pdev && tcp && request));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->sp_request); /* lm supports only one pending slow path request per connection */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "### lm_tcp_post_slow_path_request cid=%d, type=%d\n", tcp->cid, request->type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->cid && (tcp != lm_cid_cookie(pdev, TOE_CONNECTION_TYPE, tcp->cid)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_request = request;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(request->type) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* call the type specific post function that:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi execute any actions required for the specific sp request (possibly take tx/rx locks for that)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi according to state, possibly set the request status and complete the request synchronously
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi fill the appropriate content in the lm information structure of the request */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_INITIATE_OFFLOAD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_post_initiate_offload_request(pdev, tcp, &command, &data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_TERMINATE1_OFFLOAD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_post_terminate_tcp_request(pdev, tcp, &command, &data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_TERMINATE_OFFLOAD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_post_upload_tcp_request(pdev, tcp, &command, &data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_QUERY:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_post_query_request(pdev, tcp, &command, &data, request);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_TCP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_PATH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_NEIGH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_PATH_RELINK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_post_update_request(pdev, tcp, &command, &data, request);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_INVALIDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_post_invalidate_request(pdev, tcp, &command, &data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_ABORTIVE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_post_abortive_disconnect_request(pdev,tcp, &command, &data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_LOCAL_FIN_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_REMOTE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_TX_RST:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_post_empty_ramrod_request(pdev, tcp, &command, &data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("Illegal slow path request type!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(lm_status == LM_STATUS_PENDING) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "calling lm_command_post, cid=%d, command=%d, con_type=%d, data=%lx\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, command, tcp->ulp_type, data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->hdr.status == STATE_STATUS_UPLOAD_DONE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* no slow path request can be posted after connection is uploaded */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.status == STATE_STATUS_UPLOAD_DONE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_request = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_command_post(pdev, tcp->cid, command, CMD_PRIORITY_NORMAL, tcp->ulp_type, data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_request = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi request->status = lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* slow path request completion template */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// lm_status_t lm_tcp_comp_XXX_slow_path_request(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// lm_tcp_state_t *tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// ...cqe...)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// lm_tcp_slow_path_request_t *sp_request;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi//
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// DbgMessage(pdev, VERBOSEl4sp, "###lm_tcp_comp_XXX_slow_path_request\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// DbgBreakIf(tcp->hdr.status != STATE_STATUS_YYY);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// tcp->hdr.status = STATE_STATUS_ZZZ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// execute lm state actions if required
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// lm_sp_ring_command_completed (*) [not here, automatically in 'process CQ']
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// under tx lock, execute any Tx actions required (possibly call mm_*)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// under rx lock, execute any Rx actions required (possibly call mm_*)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// tcp->sp_flags ~= (SP_REQ_COMPLETED_RX | SP_REQ_COMPLETED_TX)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// tcp->sp_request->status = completion status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// sp_request = tcp->sp_request;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// tcp->sp_request = NULL
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// mm_tcp_comp_slow_path_request(tcp, sp_request)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_service_deferred_cqes(lm_device_t * pdev, lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t idx = 0, dead=FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "### lm_tcp_service_deferred_cqes cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < 2; idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while(con->flags & TCP_DEFERRED_PROCESSING) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* consistent state. at this stage, since we have the lock and deferred cqes need the lock
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * for processing, it's as if we have just processed X cqes and are about to complete the fp
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * of these cqes... During the complete of fp and sp, the lock may be released, in this case
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * more cqes may be processed, in which case TCP_DEFERRED_PROCESSING will be switched back on. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags &= ~TCP_DEFERRED_PROCESSING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "### deferred cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->type == TCP_CON_TYPE_RX) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_complete_tcp_fp(pdev, con->tcp_state, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_tx_complete_tcp_fp(pdev, con->tcp_state, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->type == TCP_CON_TYPE_RX) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_complete_tcp_sp(pdev,tcp, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_tx_complete_tcp_sp(pdev,tcp, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags &= ~TCP_COMP_DEFERRED; /* completions are no longer deferred */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* it's possible, that while processing the deferred cqes - the connection was uploaded,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * since the TCP_COMP_DEFERRED flag was still on - we didn't delete it yet, now is the time
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to delete it... note, that this can only happen while we're handling the deferred cqes of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Rx_con - since query will only complete on RX and not TX, that's why it's safe to check and
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * after handling rx we won't access this connection anymore....*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dead = lm_tcp_is_tcp_dead(pdev, tcp, TCP_IS_DEAD_OP_OFLD_COMP_DFRD);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (dead) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_del_tcp_state(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* initiate offload request completion */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_comp_initiate_offload_request(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t comp_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_slow_path_request_t *sp_request;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t *con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int i;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "##lm_tcp_comp_initiate_offload_request\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.status != STATE_STATUS_OFFLOAD_PENDING);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!comp_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { /* successful completion */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.status = STATE_STATUS_NORMAL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < 2; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(con->flags & TCP_COMP_DEFERRED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(con->flags & TCP_POST_BLOCKED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags &= ~TCP_POST_BLOCKED; /* posting is now allowed */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // update stats counters if TOE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( IP_VERSION_IPV4 == tcp->path->path_const.ip_version )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ++pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[STATS_IP_4_IDX].currently_established;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if( IP_VERSION_IPV6 == tcp->path->path_const.ip_version )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ++pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[STATS_IP_6_IDX].currently_established;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifndef _VBD_CMD_
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "initiate offload failed. err=%x\n", comp_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif // _VBD_CMD_
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.status = STATE_STATUS_INIT_OFFLOAD_ERR;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < 2; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((con->flags & ~TCP_INDICATE_REJECTED) != (TCP_POST_BLOCKED | TCP_COMP_DEFERRED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags &= ~TCP_COMP_DEFERRED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->flags |= TCP_COMP_BLOCKED; /* completions are blocked */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->sp_flags & (SP_REQUEST_COMPLETED_RX | SP_REQUEST_COMPLETED_TX));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_request->status = lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// DbgMessage(pdev, FATAL, "#lm_tcp_comp_initiate_offload_request cid=%d, sp_request->status=%d\n", tcp->cid, tcp->sp_request->status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_request = tcp->sp_request;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_request = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(tcp->sp_flags & SP_TCP_OFLD_REQ_POSTED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags |= SP_TCP_OFLD_REQ_COMP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_comp_slow_path_request(pdev, tcp, sp_request);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* handle deferred CQEs */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!comp_status && (tcp->ulp_type == TOE_CONNECTION_TYPE)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_service_deferred_cqes(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_collect_stats(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tx_con && tcp->rx_con) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.tx_bytes_posted_total += tcp->tx_con->bytes_post_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.tx_rq_complete_calls += tcp->tx_con->rq_completion_calls;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.tx_bytes_completed_total += tcp->tx_con->bytes_comp_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.tx_rq_bufs_completed += tcp->tx_con->buffer_completed_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_tx_abortion_under_flr += tcp->tx_con->abortion_under_flr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_rq_complete_calls += tcp->rx_con->rq_completion_calls;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_rq_bufs_completed += tcp->rx_con->buffer_completed_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bytes_completed_total += tcp->rx_con->bytes_comp_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_accepted_indications += tcp->rx_con->u.rx.gen_info.num_success_indicates;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bufs_indicated_accepted += tcp->rx_con->u.rx.gen_info.num_buffers_indicated;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bytes_indicated_accepted += tcp->rx_con->u.rx.gen_info.bytes_indicated_accepted;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_rejected_indications += tcp->rx_con->u.rx.gen_info.num_failed_indicates;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bufs_indicated_rejected += tcp->rx_con->u.rx.gen_info.bufs_indicated_rejected;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bytes_indicated_rejected += tcp->rx_con->u.rx.gen_info.bytes_indicated_rejected;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_num_non_full_indications += tcp->rx_con->u.rx.gen_info.num_non_full_indications;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_zero_byte_recv_reqs += tcp->rx_con->u.rx.rx_zero_byte_recv_reqs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bufs_copied_grq += tcp->rx_con->u.rx.gen_info.num_buffers_copied_grq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bufs_copied_rq += tcp->rx_con->u.rx.gen_info.num_buffers_copied_rq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bytes_copied_in_comp += tcp->rx_con->u.rx.gen_info.bytes_copied_cnt_in_comp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bytes_copied_in_post += tcp->rx_con->u.rx.gen_info.bytes_copied_cnt_in_post;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bytes_copied_in_process += tcp->rx_con->u.rx.gen_info.bytes_copied_cnt_in_process;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->toe_info.stats.max_number_of_isles_in_single_con < tcp->rx_con->u.rx.gen_info.max_number_of_isles) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.max_number_of_isles_in_single_con = tcp->rx_con->u.rx.gen_info.max_number_of_isles;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bufs_posted_total += tcp->rx_con->buffer_post_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bytes_posted_total += tcp->rx_con->bytes_post_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bufs_skipped_post += tcp->rx_con->buffer_skip_post_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bytes_skipped_post += tcp->rx_con->bytes_skip_post_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_bytes_skipped_push += tcp->rx_con->bytes_push_skip_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.rx_partially_completed_buf_cnt += tcp->rx_con->partially_completed_buf_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_droped_empty_isles += tcp->rx_con->droped_empty_isles;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_droped_non_empty_isles += tcp->rx_con->droped_non_empty_isles;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_rx_post_blocked += tcp->rx_con->rx_post_blocked;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_zb_rx_post_blocked += tcp->rx_con->zb_rx_post_blocked;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->aux_mem_flag & TCP_CON_AUX_RT_MEM_SUCCSESS_ALLOCATION) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_aux_mem_success_allocations++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if (tcp->aux_mem_flag & TCP_CON_AUX_RT_MEM_FAILED_ALLOCATION) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_aux_mem_failed_allocations++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_rx_abortion_under_flr += tcp->rx_con->abortion_under_flr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * delete tcp state from lm _except_ from actual freeing of memory.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the task of freeing of memory is done in lm_tcp_free_tcp_state()
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * global toe lock is taken by the caller
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_del_tcp_state(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "###lm_tcp_del_tcp_state\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(pdev && tcp));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!lm_fl_reset_is_inprogress(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.status >= STATE_STATUS_OFFLOAD_PENDING &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.status < STATE_STATUS_UPLOAD_DONE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "###lm_tcp_del_tcp_state under FLR\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* just a moment before we delete this connection, lets take it's info... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_collect_stats(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_remove_entry(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &tcp->hdr.state_blk->tcp_list,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &tcp->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_upld++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (tcp->ulp_type == ISCSI_CONNECTION_TYPE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->iscsi_info.run_time.stats.total_upld++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!lm_fl_reset_is_inprogress(pdev) && (tcp->path != NULL)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This is called as a result of a failured offload and not an upload...,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * if connection is uploaded it means that path must have been taken care of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * already. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((tcp->hdr.status != STATE_STATUS_INIT_OFFLOAD_ERR) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->hdr.status != STATE_STATUS_INIT) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->hdr.status != STATE_STATUS_INIT_CONTEXT));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->path->hdr.status != STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->path->num_dependents--;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->path = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->in_searcher) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* remove 4tuple from searcher */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_searcher_mirror_hash_remove(pdev, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->in_searcher = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->cid != 0) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t notify_fw = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we only notify FW if this delete is a result of upload, otherwise
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * (err_offload / error in init stage) we don't*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!lm_fl_reset_is_inprogress(pdev) && (tcp->hdr.status == STATE_STATUS_UPLOAD_DONE)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi notify_fw = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_free_cid_resc(pdev, TOE_CONNECTION_TYPE, tcp->cid, notify_fw);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.state_blk = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->ctx_virt = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->ctx_phys.as_u64 = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->aux_memory != NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (tcp->type_of_aux_memory) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case TCP_CON_AUX_RT_MEM:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "###lm_tcp_del_tcp_state: delete aux_mem (%d)\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->aux_mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->type_of_aux_memory = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_rt_free_mem(pdev,tcp->aux_memory,tcp->aux_mem_size,LM_RESOURCE_NDIS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_tcp_del_tcp_state */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * delete path state from lm
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * global toe lock is taken by the caller
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_del_path_state(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_path_state_t *path)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (path->neigh != NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(path->neigh->hdr.status != STATE_STATUS_NORMAL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This is called as a result of a synchronous path upload */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path->neigh->num_dependents--;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path->neigh = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!lm_fl_reset_is_inprogress(pdev) && (path->hdr.status != STATE_STATUS_UPLOAD_DONE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_remove_entry(&path->hdr.state_blk->path_list, &path->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * delete neigh state from lm
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * global toe lock is taken by the caller
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_del_neigh_state(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_neigh_state_t *neigh)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!lm_fl_reset_is_inprogress(pdev) && (neigh->hdr.status != STATE_STATUS_UPLOAD_DONE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_remove_entry(&neigh->hdr.state_blk->neigh_list, &neigh->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * free lm tcp state resources
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * lm_tcp_del_tcp_state() already called */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_free_tcp_resc(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t *tcp_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_t released_list_of_gen_bufs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t reset_in_progress = lm_reset_is_inprogress(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t num_isles = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t num_bytes_in_isles = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t num_gen_bufs_in_isles = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4sp, "###lm_tcp_free_tcp_resc tcp=%p\n", tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(pdev && tcp));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!reset_in_progress && tcp->hdr.status >= STATE_STATUS_OFFLOAD_PENDING &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.status < STATE_STATUS_UPLOAD_DONE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->cid); /* i.e lm_tcp_del_tcp_state wasn't called */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp_con) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* need to return the generic buffers of the isle list to the pool */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_init(&released_list_of_gen_bufs, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_isles = d_list_entry_cnt(&tcp_con->u.rx.gen_info.isles_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_bytes_in_isles = tcp_con->u.rx.gen_info.isle_nbytes;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_clear_isles(pdev, tcp, &released_list_of_gen_bufs);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_gen_bufs_in_isles = d_list_entry_cnt(&released_list_of_gen_bufs);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!d_list_is_empty(&tcp_con->u.rx.gen_info.dpc_peninsula_list)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!reset_in_progress) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_add_tail(&released_list_of_gen_bufs,&tcp_con->u.rx.gen_info.dpc_peninsula_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_init(&tcp->rx_con->u.rx.gen_info.dpc_peninsula_list, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!d_list_is_empty(&tcp_con->u.rx.gen_info.peninsula_list)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_add_tail(&released_list_of_gen_bufs,&tcp_con->u.rx.gen_info.peninsula_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_init(&tcp->rx_con->u.rx.gen_info.peninsula_list, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!reset_in_progress) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we can only have data in the peninsula if we didn't go via the upload flow (i.e. offload failure of some sort...)*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.status == STATE_STATUS_UPLOAD_DONE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->hdr.status == STATE_STATUS_UPLOAD_DONE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_bytes_lost_on_upload += tcp_con->u.rx.gen_info.peninsula_nbytes;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!d_list_is_empty(&released_list_of_gen_bufs)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_return_list_of_gen_bufs(pdev, &released_list_of_gen_bufs, 0, NON_EXISTENT_SB_IDX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!reset_in_progress && num_isles) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s32_t delta = -(s32_t)num_gen_bufs_in_isles;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_ISLES_CONTROL_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_update_isles_cnts(pdev, -(s32_t)num_isles, delta);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ISLES_CONTROL_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_tcp_free_tcp_resc */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Desciption:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * update chip internal memory and hw with given offload params
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - lm_tcp_init was already called
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS or any failure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_tcp_set_ofld_params(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_state_block_t *state_blk,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_ofld_params_t *params)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_ofld_params_t *curr_params = &pdev->ofld_info.l4_params;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(state_blk);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSE, "###lm_tcp_set_ofld_params\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we assume all timers periods can't be 0 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(params->delayed_ack_ticks &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi params->nce_stale_ticks &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi params->push_ticks &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi params->sws_prevention_ticks &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi params->ticks_per_second));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* <MichalK> Here we override the ofld info. This in theory effects iscsi as well, however, since ftsk
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * does not really use timers, and passes '0' for ka / rt in delegate/cached params its ok that
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * we're overriding the parameters here. The correct solution is to maintain this per cli-idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * but that will require major changes in l4 context initialization and not worth the effort.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *curr_params = *params;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* update internal memory/hw for each storm both with
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * toe/rdma/iscsi common params and with toe private params (where applicable) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_set_ofld_params_xstorm_common(pdev, curr_params);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_set_ofld_params_tstorm_common(pdev, curr_params);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_set_ofld_params_tstorm_toe(pdev, curr_params);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_set_ofld_params_ustorm_toe(pdev, curr_params);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_set_ofld_params_xstorm_toe(pdev, curr_params);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GilR 6/7/2006 - TBD - usage of params->starting_ip_id is not clear. currenlty we ignore it */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_tcp_set_ofld_params */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/** Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * indicates that a rst request was received. Called from several
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * functions. Could also be called as a result of a delayed rst.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_indicate_rst_received(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t *rx_con, *tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t ip_version;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //DbgMessage(pdev, WARNl4rx , "##lm_tcp_indicate_rst_received cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Update the Reset Received statistic*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ip_version = (tcp->path->path_const.ip_version == IP_VERSION_IPV4)? STATS_IP_4_IDX : STATS_IP_6_IDX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_COMMON_DRV_STATS_ATOMIC_INC_TOE(pdev, ipv[ip_version].in_reset);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( ! (pdev && tcp) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* The state may only be NORMAL or UPLOAD_PENDING */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( (tcp->hdr.status != STATE_STATUS_NORMAL) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->hdr.status != STATE_STATUS_UPLOAD_PENDING) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get the global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Change the state status if needed: NORMAL->ABORTED */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( tcp->hdr.status == STATE_STATUS_NORMAL ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.status = STATE_STATUS_ABORTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release the global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*********************** Tx **********************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Take Tx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Implies POST Tx blocked */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tx_con->flags & TCP_REMOTE_RST_RECEIVED_ALL_RX_INDICATED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->flags |= TCP_REMOTE_RST_RECEIVED_ALL_RX_INDICATED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Abort Tx buffers */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_abort_bufs(pdev, tcp, tx_con, LM_STATUS_CONNECTION_RESET);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Clear delayed RST flag */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->u.tx.flags &= ~ TCP_CON_RST_IND_NOT_SAFE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release Tx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*********************** Rx **********************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Take Rx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Clear delayed FIN and RST */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->u.rx.flags &= ~ (TCP_CON_RST_IND_PENDING | TCP_CON_FIN_IND_PENDING);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Implies POST Rx blocked */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(rx_con->flags & TCP_REMOTE_RST_RECEIVED_ALL_RX_INDICATED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->flags |= TCP_REMOTE_RST_RECEIVED_ALL_RX_INDICATED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Abort Rx buffers */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_abort_bufs(pdev, tcp, rx_con, LM_STATUS_CONNECTION_RESET);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release Rx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Indicate the Remote Abortive Disconnect to the Client */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_indicate_rst_received(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_searcher_ramrod_complete(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_slow_path_request_t * request = tcp->sp_request;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4, "## lm_tcp_searcher_ramrod_comp\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.status != STATE_STATUS_UPLOAD_PENDING);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(request->type != SP_REQUEST_TERMINATE_OFFLOAD);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_request = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi request->type = SP_REQUEST_TERMINATE1_OFFLOAD;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* remove 4tuple from searcher */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!tcp->in_searcher);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_searcher_mirror_hash_remove(pdev, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->in_searcher = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(tcp->sp_flags & SP_TCP_SRC_REQ_POSTED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags |= SP_TCP_SRC_REQ_COMP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_post_slow_path_request(pdev, tcp, request);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_terminate_ramrod_complete(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_slow_path_request_t * request = tcp->sp_request;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_request = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi request->type = SP_REQUEST_QUERY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Clear the flags */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->sp_flags & ( SP_REQUEST_COMPLETED_TX | SP_REQUEST_COMPLETED_RX ));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(tcp->sp_flags & SP_TCP_TRM_REQ_POSTED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags |= SP_TCP_TRM_REQ_COMP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Part of the fast-terminate flow is to zeroize the timers context: turn of num of active timers */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RESET_FLAGS(((struct toe_context *)tcp->ctx_virt)->timers_context.flags, __TIMERS_BLOCK_CONTEXT_NUM_OF_ACTIVE_TIMERS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_post_slow_path_request(pdev, tcp, request);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_rx_terminate_ramrod_complete(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4rx, "## lm_tcp_terminate_ramrod_comp_rx\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.status != STATE_STATUS_UPLOAD_PENDING);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( mm_tcp_indicating_bufs(rx_con) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(rx_con->flags & TCP_TRM_REQ_COMPLETED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->flags |= TCP_TRM_REQ_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_tx_terminate_ramrod_complete(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * tx_con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4tx, "## lm_tcp_terminate_ramrod_comp_tx\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.status != STATE_STATUS_UPLOAD_PENDING);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tx_con->flags & TCP_TRM_REQ_COMPLETED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->flags |= TCP_TRM_REQ_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/** Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * indicates that a fin request was received. Called from several
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * functions. Could also be called as a result of a delayed fin
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions: called without any lock taken
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_indicate_fin_received(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t ip_version;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4rx , "##lm_tcp_indicate_fin_received cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( ! ( pdev && tcp ) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ip_version = (tcp->path->path_const.ip_version == IP_VERSION_IPV4)? STATS_IP_4_IDX : STATS_IP_6_IDX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_COMMON_DRV_STATS_ATOMIC_INC_TOE(pdev, ipv[ip_version].in_fin);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->u.rx.flags &= ~TCP_CON_FIN_IND_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Mark the connection as POST_BLOCKED due to Remote FIN Received */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(rx_con->flags & TCP_REMOTE_FIN_RECEIVED_ALL_RX_INDICATED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->flags |= TCP_REMOTE_FIN_RECEIVED_ALL_RX_INDICATED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Abort pending Rx buffers */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_abort_bufs(pdev, tcp, rx_con, LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Indicate the Remote FIN up to the client */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_indicate_fin_received(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_process_retrieve_indication_cqe(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_upload_reason_t upload_reason)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t rx_flags = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t tx_flags = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4, "###lm_tcp_process_retrieve_indication_cqe cid=%d upload_reason=%d\n", tcp->cid, upload_reason);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* assert that this CQE is allowed */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we could receive this cqe after a RST / UPL, in which cases we will not notify about it. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(rx_flags, TCP_RX_COMP_BLOCKED | TCP_UPLOAD_REQUESTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(tx_flags, TCP_TX_COMP_BLOCKED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we do need to notify about it even if it's after a FIN... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RESET_FLAGS(rx_flags, TCP_REMOTE_FIN_RECEIVED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RESET_FLAGS(tx_flags, TCP_FIN_REQ_COMPLETED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!GET_FLAGS(tcp->rx_con->flags, rx_flags) && !GET_FLAGS(tcp->tx_con->flags,tx_flags)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(tcp->rx_con->flags, TCP_UPLOAD_REQUESTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4, "###Indicating UP: cid=%d upload_reason=%d\n", tcp->cid, upload_reason);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_indicate_retrieve_indication(pdev, tcp, upload_reason);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Assumption: called without any lock taken */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_rx_fin_received_complete(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t upload
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t indicate = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t is_empty_peninsula;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4rx, "###lm_tcp_rx_fin_received_complete cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( ! (pdev && tcp) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( tcp->hdr.status != STATE_STATUS_NORMAL && tcp->hdr.status != STATE_STATUS_UPLOAD_PENDING);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* break if we received a fin on the cqe and we still have an 'unreleased' generic buffer in our peninsula */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( !d_list_is_empty(&tcp->rx_con->u.rx.gen_info.dpc_peninsula_list) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Mark the connection as 'COMP_BLOCKED' and 'DB BLOCKED' */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(rx_con->flags & TCP_REMOTE_FIN_RECEIVED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->flags |= TCP_REMOTE_FIN_RECEIVED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi is_empty_peninsula = (rx_con->u.rx.gen_info.peninsula_nbytes > 0 ? 0 : 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!is_empty_peninsula || mm_tcp_indicating_bufs(rx_con) ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4, "lm_tcp_process_fin_received_cqe - postponing fin indication cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->u.rx.flags |= TCP_CON_FIN_IND_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi indicate = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_state_calc.fin_reception_time = mm_get_current_time(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tcp_state_calc.fin_reception_time == tcp->tcp_state_calc.fin_request_time) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_state_calc.fin_request_time -= 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (indicate)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_indicate_fin_received(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if(upload && !is_empty_peninsula)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we did not indicate the received fin, AND we got upload request from FW, AND peninsula is not empty,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i.e. we _may_ be waiting for RQ buffers to be posted before we indicate the fin.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Thus, we _may_ need to request for upload: */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* imitate as if FW has sent an upload request CQE: */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_process_retrieve_indication_cqe(pdev, tcp, L4_UPLOAD_REASON_UPLOAD_REQUESTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_fin_upld_requested++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_comp_empty_ramrod_request(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_slow_path_request_t * sp_req = tcp->sp_request;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->sp_flags & ( SP_REQUEST_COMPLETED_TX | SP_REQUEST_COMPLETED_RX ));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_req->status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_request = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_comp_slow_path_request(pdev, tcp, sp_req);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_rx_empty_ramrod_complete(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t sp_type)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t indicate = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4rx | INFORMl4sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "###lm_tcp_process_empty_slow_path_rcqe cid=%d, request->type=%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, sp_type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (sp_type) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_LOCAL_FIN_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_TX_RST:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break; /* relevant to scqe only */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_REMOTE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( tcp->rx_con->u.rx.flags & TCP_CON_RST_IND_PENDING ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* process it */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Mark Rx ready for RST indication - before it was marked as 'delayed' */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags |= REMOTE_RST_INDICATED_RX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( (tcp->sp_flags & REMOTE_RST_INDICATED_RX) && (tcp->sp_flags & REMOTE_RST_INDICATED_TX) ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi indicate = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (indicate) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_indicate_rst_received(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } /* o/w we haven't seen the TX yet... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if ( tcp->rx_con->u.rx.flags & TCP_CON_FIN_IND_PENDING ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* process it */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_indicate_fin_received(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "'empty ramrod' opcode in cqe doesn't fit with sp_request->type %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_tx_empty_ramrod_complete(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t sp_type)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t indicate = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4tx | INFORMl4sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "###lm_tcp_process_empty_slow_path_scqe cid=%d, request->type=%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->cid, sp_type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (sp_type) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_LOCAL_FIN_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* process it */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tcp->tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_abort_bufs(pdev,tcp,tcp->tx_con,LM_STATUS_ABORTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tcp->tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_REMOTE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break; /* rcqe only */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_TX_RST:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* safe to abort buffers at this stage - we know none are pending on pbf */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->tx_con->u.tx.flags & TCP_CON_RST_IND_NOT_SAFE ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* process it */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Mark Rx ready for RST indication - before it was marked as 'delayed' */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags |= REMOTE_RST_INDICATED_TX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( (tcp->sp_flags & REMOTE_RST_INDICATED_RX) && (tcp->sp_flags & REMOTE_RST_INDICATED_TX) ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi indicate = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tcp->tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tx_con->u.tx.flags &= ~TCP_CON_RST_IND_NOT_SAFE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tcp->tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (indicate) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_indicate_rst_received(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } /* o/w we haven't seen the RX yet... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "'empty ramrod' opcode in cqe doesn't fit with sp_request->type %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_comp_abortive_disconnect_request(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_slow_path_request_t * request
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t *rx_con, *tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t delayed_rst = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t ip_version;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t complete_sp_request = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( ! (pdev && tcp && request) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Update the statistics */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ip_version = (tcp->path->path_const.ip_version == IP_VERSION_IPV4)? STATS_IP_4_IDX : STATS_IP_6_IDX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_COMMON_DRV_STATS_ATOMIC_INC_TOE(pdev, ipv[ip_version].out_resets);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* The state may only be NORMAL or ABORTED (due to remote RST) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( ( tcp->hdr.status != STATE_STATUS_NORMAL ) && ( tcp->hdr.status != STATE_STATUS_ABORTED ) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* the FW will always post a RST packet no matter if
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi remote RST was already received, therefore, the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi completion status of the request is always SUCCESS */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi request->status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.status = STATE_STATUS_ABORTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_state_calc.con_rst_flag = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /***************** Tx ********************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get Tx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Clear delayed RST flag */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->u.tx.flags &= ~ TCP_CON_RST_IND_NOT_SAFE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* safe to abort buffers anyway, even if we have a non-safe tx abort, since this means that a ramrod has been sent so queues are clear */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_abort_bufs(pdev,tcp,tx_con, LM_STATUS_ABORTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release Tx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/***************** Rx ********************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get Rx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* 'POST/IND BLOCKED' in the request. Even a post was in the middle it must be done by now */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (mm_tcp_indicating_bufs(rx_con)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_support_pending_sp_req_complete) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(ABORTIVE_DISCONNECT_DURING_IND));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi complete_sp_request = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_request_pending_completion = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->pending_abortive_disconnect++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_inc(&pdev->toe_info.stats.total_aborive_disconnect_during_completion);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "Abortive disconnect completion during indication(%d)\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( rx_con->u.rx.flags & TCP_CON_RST_IND_PENDING ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi delayed_rst = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Clear delayed RST and FIN flags */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->u.rx.flags &= ~ (TCP_CON_RST_IND_PENDING | TCP_CON_FIN_IND_PENDING);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_abort_bufs(pdev,tcp, rx_con, LM_STATUS_ABORTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release Rx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*****************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( delayed_rst ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GilR 10/15/2006 - TBD - since anyway we complete the request
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi with status SUCCESS, we do not need to indicate a remote RST
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi that was delayed. therefore the following call to
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_indicate_rst_received is canceled */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //mm_tcp_indicate_rst_received(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (complete_sp_request) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->sp_flags & ( SP_REQUEST_COMPLETED_TX | SP_REQUEST_COMPLETED_RX ));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_request = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_comp_slow_path_request(pdev, tcp, request);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_rx_rst_received_complete (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t indicate = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4rx , "###lm_tcp_process_rst_received_rcqe cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( ! (pdev && tcp) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* The state may only be NORMAL or UPLOAD_PENDING */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( (tcp->hdr.status != STATE_STATUS_NORMAL) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->hdr.status != STATE_STATUS_UPLOAD_PENDING) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Take the Rx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* break if we received a rst on the cqe and we still have an 'unreleased' generic buffer in our peninsula */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( !d_list_is_empty(&tcp->rx_con->u.rx.gen_info.dpc_peninsula_list) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This will imply RX_COMP_LOCKED and RX_DB_BLOCKED */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(rx_con->flags & TCP_REMOTE_RST_RECEIVED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->flags |= TCP_REMOTE_RST_RECEIVED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Clear pending FIN */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->u.rx.flags &= ~ TCP_CON_FIN_IND_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Check if all received data has been completed towards the Client */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (rx_con->u.rx.gen_info.peninsula_nbytes || mm_tcp_indicating_bufs(rx_con) ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4rx , "lm_tcp_process_rst_received_cqe - postponing rst indication cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->u.rx.flags |= TCP_CON_RST_IND_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Mark Rx ready for RST indication */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags |= REMOTE_RST_INDICATED_RX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release the Rx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( (tcp->sp_flags & REMOTE_RST_INDICATED_RX) && (tcp->sp_flags & REMOTE_RST_INDICATED_TX) ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi indicate = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_state_calc.con_rst_flag = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Indicate the RST to the Client if it was the second completion */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( indicate ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_indicate_rst_received(pdev,tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_tx_rst_received_complete (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t indicate = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t send_empty_ramrod = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t upload_on_fail = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4tx, "###lm_tcp_tx_rst_received_complete cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( ! (pdev && tcp) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* The state may only be NORMAL or UPLOAD_PENDING */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( (tcp->hdr.status != STATE_STATUS_NORMAL) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->hdr.status != STATE_STATUS_UPLOAD_PENDING) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Take the Tx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This will imply TX_COMP_LOCKED and TX_DB_BLOCKED */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tx_con->flags & TCP_REMOTE_RST_RECEIVED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->flags |= TCP_REMOTE_RST_RECEIVED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* There is a potential race between receiving a reset to aborting buffers, once reset is received from te CSTORM it doesn't mean that
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the pbf isn't trying to transmit any other buffers, to make sure that it flushes remaining buffers we need to pass a ramrod - any ramrod,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * if the active_tb_list is not empty, if the tx post is blocked already, it means its too late, rst / fin / trm / inv were posted, so we don't
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * abort the buffers - they will be aborted later on... to make sure buffers aren't aborted we turn on the TCP_CON_RST_IND_NOT_SAFE flag. they'll
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * be aborted in terminate later on. we won't send the indication as well, we'll send it when completing terminate / empty ramrod later on.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Check if all received data has been completed towards the Client + terminate ramrod has not been posted yet */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( s_list_entry_cnt(&tx_con->active_tb_list) > 0 ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4rx, "TX lm_tcp_process_rst_received_cqe - postponing rst indication cid=%d sending empty ramrod\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->u.tx.flags |= TCP_CON_RST_IND_NOT_SAFE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* send the empty ramrod only if we're not blocked already.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * TCP_TX_POST_BLOCKED includes FIN_REQ_POSTED case in which we should send the empty ramrod,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and REMOTE_RST_RECEIVED_ALL_RX_INDICATED, TCP_POST_BLOCKED that shouldn't be set when reaching this point,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * so we'll check all other the relevant flags.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * here we determine whether to send the ramrod according to the lm flags, it is possible that the ramrod will be dropped later
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * in the mm_tcp_post_empty_slow_path_request() due upload request pending in the um */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!(tx_con->flags & (TCP_RST_REQ_POSTED | TCP_INV_REQ_POSTED | TCP_TRM_REQ_POSTED))) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi send_empty_ramrod = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Mark Tx ready for RST indication */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags |= REMOTE_RST_INDICATED_TX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release the Tx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( (tcp->sp_flags & REMOTE_RST_INDICATED_RX) && (tcp->sp_flags & REMOTE_RST_INDICATED_TX) ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi indicate = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_state_calc.con_rst_flag = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if ( tcp->sp_flags & REMOTE_RST_INDICATED_RX ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi upload_on_fail = 1; /* RX is done, the only reason that TX isn't is because it has buffers to abort, if we can't postpone tx, indicate anyway. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_state_calc.con_rst_flag = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Indicate the RST to the Client if it was the second completion */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( indicate ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_indicate_rst_received(pdev,tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if (send_empty_ramrod) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Send empty ramrod, only when it is complete we can complete the reset i.e. tx reset received.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * it is possible that the ramrod will be dropped due upload request pending in the um */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4tx, "Sending Empty Ramrod TX\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = mm_tcp_post_empty_slow_path_request(pdev, tcp, SP_REQUEST_PENDING_TX_RST);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((lm_status != LM_STATUS_PENDING) && (lm_status != LM_STATUS_UPLOAD_IN_PROGRESS)) { /* we expect the posting of an empty ramrod to be pending... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This is a bit of a problem here...we don't want to risk the pbf accessing released data, so instead
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * we risk the application turning an error, we delay the abort of buffers till the terminate stage.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * we don't remove the RST_IND_PENDING... we'll look at that before aborting buffers... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (upload_on_fail) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4sp, "Couldn't send empty ramrod on TX when we needed\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* instead of indicating the rst, which is NOT possible at this stage, ask for connection upload */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_indicate_retrieve_indication(pdev, tcp, L4_UPLOAD_REASON_UPLOAD_REQUESTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_rst_upld_requested++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_rx_abortive_disconnect_ramrod_complete (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4rx, "###lm_tcp_process_abortive_disconnect_request_rcqe cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( ! (pdev && tcp) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Take the Rx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* break if we received a rst on the cqe and we still have an 'unreleased' generic buffer in our peninsula */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( !d_list_is_empty(&tcp->rx_con->u.rx.gen_info.peninsula_list) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (((lm_tcp_gen_buf_t *)(d_list_peek_tail(&tcp->rx_con->u.rx.gen_info.peninsula_list)))->placed_bytes == 0));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This implies COMP_BLOCKED */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->flags |= TCP_RST_REQ_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release the Tx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_tx_abortive_disconnect_ramrod_complete (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4tx, "###lm_tcp_tx_abortive_disconnect_request_complete cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( ! (pdev && tcp) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Take the Tx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This implies COMP_BLOCKED */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->flags |= TCP_RST_REQ_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release the Tx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_comp_invalidate_request(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_slow_path_request_t * request)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "### Completing invalidate request cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!pdev || !tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->hdr.status != STATE_STATUS_NORMAL && tcp->hdr.status != STATE_STATUS_ABORTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->hdr.status = STATE_STATUS_INVALIDATED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_request = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi request->status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->sp_flags & ( SP_REQUEST_COMPLETED_TX | SP_REQUEST_COMPLETED_RX ));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_comp_slow_path_request(pdev, tcp, request);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_tx_invalidate_ramrod_complete (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4tx, "###lm_tcp_tx_invalidate_request_complete cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( ! (pdev && tcp) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Take the Tx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This implies COMP_BLOCKED */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tx_con->flags & TCP_INV_REQ_COMPLETED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->flags |= TCP_INV_REQ_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release the Tx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_rx_invalidate_ramrod_complete (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4rx, "###lm_tcp_process_invalidate_request_rcqe cid=%d\n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( ! (pdev && tcp) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Take the Rx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* 'POST/IND BLOCKED' in the request.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Even a post was in the middle it must be done by now
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( mm_tcp_indicating_bufs(rx_con) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* break if we received an invalidate on the cqe and we still have an 'unreleased' generic buffer in our peninsula */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( !d_list_is_empty(&tcp->rx_con->u.rx.gen_info.peninsula_list) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (((lm_tcp_gen_buf_t *)(d_list_peek_tail(&tcp->rx_con->u.rx.gen_info.peninsula_list)))->placed_bytes == 0));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This implies COMP_BLOCKED */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(rx_con->flags & TCP_INV_REQ_COMPLETED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->flags |= TCP_INV_REQ_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release the Rx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_tcp_get_delegated(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN void * ctx_p /* context with updated data */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct xstorm_toe_tcp_ag_context_section * xag_tcp = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct tstorm_tcp_st_context_section * tst_tcp = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct xstorm_tcp_context_section * xst_tcp = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct tstorm_toe_tcp_ag_context_section * tag_tcp = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ustorm_toe_st_context * ust_toe = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct cstorm_toe_st_context * cst_toe = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct xstorm_toe_ag_context * xag_toe = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct xstorm_toe_context_section * xst_toe = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t send_wnd;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t sanity_check;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(sizeof(struct xstorm_toe_tcp_ag_context_section) == sizeof(struct xstorm_tcp_tcp_ag_context_section));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(sizeof(struct tstorm_toe_tcp_ag_context_section) == sizeof(struct tstorm_tcp_tcp_ag_context_section));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sanity_check = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Set shortcuts... and take care of driver delegated params. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xst_tcp = &((struct toe_context *)ctx_p)->xstorm_st_context.context.common.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xag_tcp = &((struct toe_context *)ctx_p)->xstorm_ag_context.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tst_tcp = &((struct toe_context *)ctx_p)->tstorm_st_context.context.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tag_tcp = &((struct toe_context *)ctx_p)->tstorm_ag_context.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xst_toe = &((struct toe_context *)ctx_p)->xstorm_st_context.context.toe;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xag_toe = &((struct toe_context *)ctx_p)->xstorm_ag_context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cst_toe = &((struct toe_context *)ctx_p)->cstorm_st_context.context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ust_toe = &((struct toe_context *)ctx_p)->ustorm_st_context.context;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (S32_SUB(tcp->rx_con->u.rx.sws_info.drv_rcv_win_right_edge, tcp->rx_con->db_data.rx->rcv_win_right_edge) < 0) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* due to window decrease issues... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.sws_info.drv_rcv_win_right_edge = tcp->rx_con->db_data.rx->rcv_win_right_edge;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* RcvWnd = WndRightEgde - RcvNext */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* recv_win_seq is determined by the driver, and therefore is the most up-to-date value,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * we also have to add any pending indicated bytes to this value, and this is because we don't
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * add them immediatel, only when the buffer is returned to help limit our GRQ pool. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.recv_win_seq = tcp->rx_con->u.rx.sws_info.drv_rcv_win_right_edge +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.gen_info.pending_indicated_bytes;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!lm_reset_is_inprogress(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sanity_check = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (tcp->ulp_type == ISCSI_CONNECTION_TYPE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xst_tcp = &((struct iscsi_context *)ctx_p)->xstorm_st_context.common.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xag_tcp = (struct xstorm_toe_tcp_ag_context_section *)&((struct iscsi_context *)ctx_p)->xstorm_ag_context.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tst_tcp = &((struct iscsi_context *)ctx_p)->tstorm_st_context.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tag_tcp = (struct tstorm_toe_tcp_ag_context_section *)&((struct toe_context *)ctx_p)->tstorm_ag_context.tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* RcvWnd = WndRightEgde - RcvNext */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.recv_win_seq = tag_tcp->wnd_right_edge - tst_tcp->rcv_nxt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_tcp_get_delegated: Unsupported protocol type \n") ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Sanity Checks: (block below)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the purpose for sanity checks below, under debug only is to find a problem in FW delegated params before
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * we send them to OS in which case it may assert later on, or worse after several offloads.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Perform sanity checks only if chip isn't under reset... In case of error recovery for example, these delegated
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * params may be rubbish, it's ok since in the same case we'll also send a LM_STATUS_FAILURE in the upload completion.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (sanity_check)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* context sanity checks */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if !defined(_VBD_CMD_)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check that DMA write towards host is done */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(((struct toe_context *)ctx_p)->ustorm_ag_context.__state == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(((struct toe_context *)ctx_p)->tstorm_ag_context.__state == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(((struct toe_context *)ctx_p)->xstorm_ag_context.__state == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* needs to be: t <= x <= u <= drv */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* driver window right edge >= ust.prev_rcv_win_right_edge >= xag.local_adv_wnd >= tag.wnd_right_edge (cyclic)*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// apply in w2k3
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// DbgBreakIf(S32_SUB(xag_tcp->local_adv_wnd, tag_tcp->wnd_right_edge) < 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// DbgBreakIf(S32_SUB(ust_toe->prev_rcv_win_right_edge, xag_tcp->local_adv_wnd) < 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// DbgBreakIf(S32_SUB(tcp->rx_con->u.rx.sws_info.drv_rcv_win_right_edge, ust_toe->prev_rcv_win_right_edge) < 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* xag.snd_nxt <= xst.snd_max */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(S32_SUB(xag_tcp->snd_nxt, xst_tcp->snd_max) > 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* xag.snd_una <= tag.snd_una <= tag.snd_max <= xst.snd_max */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(S32_SUB(xag_tcp->snd_una, tag_tcp->snd_una) != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(S32_SUB(tag_tcp->snd_una, tag_tcp->snd_max) > 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // TBD: the assert is not valid, discuess with FW regarding a change. DbgBreakIf(S32_SUB(tag_tcp->snd_max, xst_tcp->snd_max) > 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* xag.cmp_bd_start_seq <= c.cmp_bd_start_seq <= tag.snd_una */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(S32_SUB(xag_toe->cmp_bd_start_seq, tag_tcp->snd_una) > 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* tst.rcv_nxt >= xag.ack_to_far_end */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(S32_SUB(tst_tcp->rcv_nxt, xag_tcp->ack_to_far_end) != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* tst.rcv_nxt >= tst.prev_seg_seq */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //DbgBreakIf(S32_SUB(tst_tcp->rcv_nxt, tst_tcp->prev_seg_seq) < 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* xag.cmp_bd_cons <= cst.bd_cons <= xst.tx_bd_cons <= xst.bd_prod <= Driver bd prod (16 bit cyclic) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(S16_SUB(xag_toe->cmp_bd_cons, cst_toe->bd_cons) > 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(S16_SUB(xst_toe->tx_bd_cons, xst_toe->bd_prod) > 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(S16_SUB(xst_toe->bd_prod, tcp->tx_con->db_data.tx->bds_prod) > 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(S32_SUB(tag_tcp->snd_una, xag_tcp->snd_nxt) > 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* timestamp: */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* tst.timestamp_exists == xst.ts_enable -- ? can't find fields in fw*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* tst.timestamp_recent >= xag.ts_to_echo (cyclic) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(S32_SUB(tst_tcp->timestamp_recent, xag_tcp->ts_to_echo) < 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* fin: ?? can't find fields in fw */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* if (xst.fin_sent_flag) then bds should contain bd with fin // driver flag 'sent-fin' */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* if (tag.fin_sent_flag) then xst.fin_sent_flag */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check that rcv nxt has the expected value compared to bytes that were completed on rx application buffers and generic buffers */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* rx_bytes_recv = tcp->rx_con->bytes_comp_cnt +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->u.rx.gen_info.bytes_indicated_accepted +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->sp_request->ret_data.tcp_upload_data.frag_list ? tcp->sp_request->ret_data.tcp_upload_data.frag_list->size : 0) -
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->rx_con->bytes_push_skip_cnt -
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->rx_con->flags & TCP_REMOTE_FIN_RECEIVED)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(((u32_t)(tcp->tcp_delegated.recv_next + (u32_t)rx_bytes_recv + 1) != tst_tcp->rcv_nxt));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(((u32_t)(tcp->tcp_delegated.recv_next + (u32_t)rx_bytes_recv) != tst_tcp->rcv_nxt));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check that cstrom rel seq is equal to tstorm snd una */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(((struct toe_context *)ctx_p)->cstorm_ag_context.rel_seq != tag_tcp->snd_una);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check that snd una has the expected value compared to bytes that were completed on tx application buffers */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((u32_t)(tcp->tcp_delegated.send_una + (u32_t)tcp->tx_con->bytes_comp_cnt + (u32_t)tcp->tx_con->bytes_trm_aborted_cnt - (u32_t)tcp->tx_con->bytes_aborted_cnt) != tag_tcp->snd_una);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Set the updated delegated parameters */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.recv_next = tst_tcp->rcv_nxt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.send_una = tag_tcp->snd_una;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.send_next = xag_tcp->snd_nxt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.send_max = xst_tcp->snd_max;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* recent_seg_wnd is the value received in the last packet from the other side. This means this value is scaled,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * therefore we need to get the absolute value by 'unscaling' it */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.send_win = (tst_tcp->recent_seg_wnd << tcp->tcp_const.snd_seg_scale)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi + tcp->tcp_delegated.send_una;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi send_wnd = tst_tcp->recent_seg_wnd << tcp->tcp_const.snd_seg_scale;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Does not come from chip! Driver uses what the chip returned for SndWnd,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi and takes the maximum between that, all past query results for this paramter,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi and 2 * MSS.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( tcp->tcp_delegated.max_send_win < tcp->tcp_delegated.send_win - tcp->tcp_delegated.send_una) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.max_send_win = tcp->tcp_delegated.send_win - tcp->tcp_delegated.send_una;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.send_wl1 = tst_tcp->prev_seg_seq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.send_cwin = tst_tcp->cwnd + tcp->tcp_delegated.send_una;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.ss_thresh = tst_tcp->ss_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.sm_rtt = (tst_tcp->flags1 & TSTORM_TCP_ST_CONTEXT_SECTION_RTT_SRTT)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi >> TSTORM_TCP_ST_CONTEXT_SECTION_RTT_SRTT_SHIFT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.sm_delta = (tst_tcp->flags2 & TSTORM_TCP_ST_CONTEXT_SECTION_RTT_VARIATION)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi >> TSTORM_TCP_ST_CONTEXT_SECTION_RTT_VARIATION_SHIFT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* convert ms to ticks. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //16/09/2008 NirV: Assert removed, return upon fw fix
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //DbgBreakIf(tcp->tcp_delegated.sm_rtt > (35*TIMERS_TICKS_PER_SEC));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //DbgBreakIf(tcp->tcp_delegated.sm_delta > (35*TIMERS_TICKS_PER_SEC));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.sm_rtt =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tcp->tcp_delegated.sm_rtt, TIMERS_TICKS_PER_SEC, pdev->ofld_info.l4_params.ticks_per_second)*8;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.sm_delta =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tcp->tcp_delegated.sm_delta, TIMERS_TICKS_PER_SEC, pdev->ofld_info.l4_params.ticks_per_second)*4;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.ts_recent = tst_tcp->timestamp_recent;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* convert ms to ticks. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.ts_recent_age =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tst_tcp->timestamp_recent_time, TSEMI_CLK1_TICKS_PER_SEC, pdev->ofld_info.l4_params.ticks_per_second);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.tstamp = xst_tcp->ts_time_diff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* convert ms to ticks. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.total_rt =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, tst_tcp->retransmit_start_time, TIMERS_TICKS_PER_SEC, pdev->ofld_info.l4_params.ticks_per_second);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.dup_ack_count = tst_tcp->dup_ack_count;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.snd_wnd_probe_count = tst_tcp->persist_probe_count;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp->tcp_delegated.send_una == tcp->tcp_delegated.send_max && (send_wnd > 0)) { /* KA is running (?) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( (tcp->tcp_cached.tcp_flags & TCP_FLAG_ENABLE_KEEP_ALIVE)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.u.keep_alive.probe_cnt = tst_tcp->ka_probe_count;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* convert ms to ticks. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.u.keep_alive.timeout_delta =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_time_resolution(pdev, xag_tcp->ka_timer, TIMERS_TICKS_PER_SEC, pdev->ofld_info.l4_params.ticks_per_second);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* ka timeout may be negative in cases that it expired and timer was armed for other purposes. In this case - we write 0 to the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * timeout delta - OS will treat this as if timer has just expired */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* bugbug, for some reason, we get a 28 bit value from FW, so a value such as 0xffffff9 is actually negative... so instead of checking (the reason is that timer's block bus width is 28 bit - ariel)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * negative - we just check if it's larger than 0x8000000*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((tcp->tcp_delegated.u.keep_alive.timeout_delta != 0xffffffff) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->tcp_delegated.u.keep_alive.timeout_delta > 0x8000000)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.u.keep_alive.timeout_delta = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else { //ka disabled
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.u.keep_alive.probe_cnt = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.u.keep_alive.timeout_delta = 0xffffffff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.u.retransmit.num_retx = tst_tcp->retransmit_count;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //TBD: Ariel, why it comes from the same place as TotalRT?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TODO: we need to convert retx_ms to clock ticks in VBD instead of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * doing this conversion in NDIS (same as Teton) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* rto_timer may be negative in cases that it expired and timer was armed for other purposes. In this case - we write 0 to the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * retx_ms - OS will treat this as if timer has just expired and immediately retransmit. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* bugbug, for some reason, we get a 28 bit value from FW, so a value such as 0xffffff9 is actually negative... so instead of checking
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * negative - we just check if it's larger than 0xf000000*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((xag_tcp->rto_timer != 0xffffffff) && (xag_tcp->rto_timer > 0x8000000)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.u.retransmit.retx_ms = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.u.retransmit.retx_ms = xag_tcp->rto_timer;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Calculate the TCP connection state */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.con_state = lm_tcp_calc_state(pdev, tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi xst_tcp->tcp_params & XSTORM_TCP_CONTEXT_SECTION_FIN_SENT_FLAG ? 1 : 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.con_state_on_upload[tcp->tcp_delegated.con_state]++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_init_sp_req_type(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_slow_path_request_t * lm_req,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * req_input_data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(lm_req->type) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_INITIATE_OFFLOAD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_TERMINATE_OFFLOAD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_LOCAL_FIN_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_REMOTE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_TX_RST:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_ABORTIVE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_INVALIDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_TCP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_PATH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_NEIGH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_PATH_RELINK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_req->sent_data.tcp_update_data.data = req_input_data;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_QUERY:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("GilR - NOT IMPLEMENTED!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("Illegal slow path request type!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* initialize common section of the sp request */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_req->sp_req_common.req_post_func = (void *)lm_tcp_post_slow_path_request;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_req->sp_req_common.req_post_ctx = tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void _lm_tcp_comp_upload_tcp_request (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * rx_con = tcp->rx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_con_t * tx_con = tcp->tx_con;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t has_fin = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t has_rst = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_slow_path_request_t * sp_req = tcp->sp_request;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_path_state_t * path = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #if 0 // TODO: add WINDOW_DEC validation check in w2k3, implement upon os type identification in the lm
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #if (DBG && !defined(_VBD_CMD_) && !defined(__USER_MODE_DEBUG))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t expect_rwin;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* status will be changed only after upload completion returns from the client */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Abort Tx buffers and pending graceful disconnect request if any */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_abort_bufs(pdev, tcp, tx_con, (tx_con->flags & TCP_CON_RST_IND_NOT_SAFE)? LM_STATUS_CONNECTION_RESET : LM_STATUS_UPLOAD_IN_PROGRESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Remember pending RST if any */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi has_rst |= (tx_con->u.tx.flags & TCP_CON_RST_IND_NOT_SAFE) ? 1 : 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Clear pending RST */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_con->u.tx.flags &= ~(TCP_CON_RST_IND_NOT_SAFE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Rx abortive part... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Abort pending buffers */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_abort_bufs(pdev, tcp, rx_con, LM_STATUS_UPLOAD_IN_PROGRESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Remember pending FIN if any */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi has_fin = rx_con->u.rx.flags & TCP_CON_FIN_IND_PENDING ? 1 : 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Remember pending RST if any */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi has_rst |= (rx_con->u.rx.flags & TCP_CON_RST_IND_PENDING) ? 1 : 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Clear pending FIN and RST */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_con->u.rx.flags &= ~(TCP_CON_FIN_IND_PENDING | TCP_CON_RST_IND_PENDING);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get generic data that hasn't been indicated so far */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tcp_rx_get_buffered_data_from_terminate(pdev, tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &(tcp->sp_request->ret_data.tcp_upload_data.frag_list),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &(tcp->sp_request->ret_data.tcp_upload_data.ret_buf_ctx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check if we have a delayed fin */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* assumption: if we have a delayed-fin, it means we have buffered data*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* OS can't handle fin indiaction followed by buffered data */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* DbgBreakIf(has_fin && !sp_req->ret_data.tcp_upload_data.frag_list); */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* DbgBreakIf(has_rst && !sp_req->ret_data.tcp_upload_data.frag_list); */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check if we have a delayed rst (rst is sp so no locks) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( has_rst ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_indicate_rst_received(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Indication part */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(tcp->sp_flags & SP_TCP_QRY_REQ_POSTED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags |= SP_TCP_QRY_REQ_COMP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Update delegated parameters */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_get_delegated(pdev, tcp, &tcp->sp_req_data.virt_addr->toe_ctx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_request = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_req->status = lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Indicate SP request completion up to the client */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Set the request type to TERMINATE_OFFLOAD as it was set by UM during the post */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_req->type = SP_REQUEST_TERMINATE_OFFLOAD;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->path->num_dependents == 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->path->num_dependents--;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // update stats counters if TOE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (TOE_CONNECTION_TYPE == tcp->ulp_type )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( IP_VERSION_IPV4 == tcp->path->path_const.ip_version )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi --pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[STATS_IP_4_IDX].currently_established;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if( IP_VERSION_IPV6 == tcp->path->path_const.ip_version )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi --pdev->vars.stats.stats_mirror.stats_drv.drv_toe.ipv[STATS_IP_6_IDX].currently_established;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->path->hdr.status == STATE_STATUS_UPLOAD_PENDING &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->path->num_dependents == 0) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* last pendind-upload-path dependent... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path = tcp->path;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->path = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #if 0 // TODO: add WINDOW_DEC validation check in w2k3, implement upon os type identification in the lm
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->ulp_type == TOE_CONNECTION_TYPE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #if (DBG && !defined(_VBD_CMD_) && !defined(__USER_MODE_DEBUG))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi expect_rwin = (u32_t) S32_SUB(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.recv_win_seq,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_delegated.recv_next);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* These asserts are not valid for WSD connections. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(sp_req->ret_data.tcp_upload_data.frag_list)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi expect_rwin += (u32_t)sp_req->ret_data.tcp_upload_data.frag_list->size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If we received a fin / rst we may be down by one on the initial_rcv_wnd... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if((tcp->rx_con->flags & TCP_REMOTE_FIN_RECEIVED) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->rx_con->flags & TCP_REMOTE_RST_RECEIVED))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (expect_rwin != tcp->tcp_cached.initial_rcv_wnd) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (expect_rwin != tcp->tcp_cached.initial_rcv_wnd - 1));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(expect_rwin != tcp->tcp_cached.initial_rcv_wnd);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_comp_slow_path_request(pdev, tcp, sp_req);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (path) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "_lm_tcp_comp_upload_request: last tcp dependent of pending path %p\n", path);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_tcp_comp_upload_path_request(pdev, path);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_tcp_state_t * lm_tcp_get_next_path_dependent(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void *path_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp_state == NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = (lm_tcp_state_t *) d_list_peek_head(&pdev->toe_info.state_blk.tcp_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = (lm_tcp_state_t *) d_list_next_entry(&tcp_state->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while(tcp_state) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Update the tcp state only if it is a dependent and is not being offloaded,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * invalidated, or uploaded. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp_state->path == (lm_path_state_t*)path_state) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return tcp_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = (lm_tcp_state_t *) d_list_next_entry(&tcp_state->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_tcp_state_t * lm_tcp_get_next_neigh_dependent(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * neigh_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp_state == NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = (lm_tcp_state_t *) d_list_peek_head(&pdev->toe_info.state_blk.tcp_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = (lm_tcp_state_t *) d_list_next_entry(&tcp_state->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while(tcp_state) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Update the tcp state only if it is a dependent and is not being offloaded,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * invalidated, or uploaded. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp_state->path && (tcp_state->path->neigh == (lm_neigh_state_t*)neigh_state)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return tcp_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = (lm_tcp_state_t *) d_list_next_entry(&tcp_state->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_update_ramrod_complete(lm_device_t * pdev, lm_tcp_state_t * tcp)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_slow_path_request_t *sp_req;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_INIT_TCP_LOCK_HANDLE();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp, "###lm_tcp_update_ramrod_complete cid=%d \n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* assert state status is NORMAL */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( (tcp->hdr.status != STATE_STATUS_NORMAL) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->hdr.status != STATE_STATUS_ABORTED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->sp_request == NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((tcp->sp_request->type != SP_REQUEST_UPDATE_NEIGH) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->sp_request->type != SP_REQUEST_UPDATE_PATH) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->sp_request->type != SP_REQUEST_UPDATE_TCP) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tcp->sp_request->type != SP_REQUEST_UPDATE_PATH_RELINK));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_req = tcp->sp_request;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->sp_flags & ( SP_REQUEST_COMPLETED_TX | SP_REQUEST_COMPLETED_RX ));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_req->status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_request = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Take the Rx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_acquire_tcp_lock(pdev, tcp->rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((sp_req->type == SP_REQUEST_UPDATE_TCP) && (GET_FLAGS(tcp->rx_con->db_data.rx->flags, TOE_RX_DB_DATA_IGNORE_WND_UPDATES)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_post_sws(pdev, tcp, tcp->rx_con, tcp->rx_con->dpc_info.dpc_fw_wnd_after_dec, TCP_RX_POST_SWS_SET);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Release the Rx lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_release_tcp_lock(pdev, tcp->rx_con);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_comp_slow_path_request(pdev, tcp, sp_req);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_query_ramrod_complete(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEl4, "## lm_tcp_query_ramrod_comp\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(! tcp->sp_request );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(tcp->sp_request->type != SP_REQUEST_QUERY);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp->hdr.status == STATE_STATUS_UPLOAD_PENDING) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_tcp_comp_upload_tcp_request(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("Vladz: Not implemented yet!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* TOE lock should be taken by hte caller */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_internal_query(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *tcp_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t status_arr[STATE_STATUS_ERR+1] = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t status, num_tcps, i;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "## lm_tcp_debug_query START version %d.%d.%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DRIVER_MAJOR_VER, LM_DRIVER_MINOR_VER, LM_DRIVER_FIX_NUM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_tcps = d_list_entry_cnt(&pdev->toe_info.state_blk.tcp_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = (lm_tcp_state_t *)d_list_peek_head(&pdev->toe_info.state_blk.tcp_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (tcp_state) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi status = tcp_state->hdr.status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi status_arr[status]++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check state's status */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(status != STATE_STATUS_NORMAL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "# tcp ptr 0x%p (cid %d), has status=%d (!= normal)\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state, tcp_state->cid, status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* verify the is no pending slow path request */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp_state->sp_request) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "# tcp ptr 0x%p (cid %d), has slow path request of type %d, not completed by FW (sp comp flags=0x%x\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state, tcp_state->cid, tcp_state->sp_request->type, tcp_state->sp_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* verify the is no bytes pending completion */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp_state->tx_con->bytes_post_cnt != tcp_state->tx_con->bytes_comp_cnt) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "# tcp ptr 0x%p (cid %d), has TX pending bytes (%d). (con->flags=0x%x)\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state, tcp_state->cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi S64_SUB(tcp_state->tx_con->bytes_post_cnt, tcp_state->tx_con->bytes_comp_cnt),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state->tx_con->flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tcp_state->rx_con->bytes_post_cnt != tcp_state->rx_con->bytes_comp_cnt) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "# tcp ptr 0x%p (cid %d), has RX pending bytes (%d). (con->flags=0x%x)\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state, tcp_state->cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi S64_SUB(tcp_state->rx_con->bytes_post_cnt, tcp_state->rx_con->bytes_comp_cnt),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state->rx_con->flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = (lm_tcp_state_t *)d_list_next_entry((d_list_entry_t*)tcp_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* print statistics */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "# num offloaded connections=%d\n", num_tcps);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < STATE_STATUS_ERR+1; i++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (status_arr[i]) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "# num connections in status %d=%d\n", i, status_arr[i]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "## lm_tcp_debug_query END\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_upld_close_received_complete(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_upload_reason_t upload_reason)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4sp , "###lm_tcp_drv_upl_received_complete cid=%d \n", tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->tcp_state_calc.con_upld_close_flag = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_process_retrieve_indication_cqe(pdev, tcp, upload_reason);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_close_upld_requested++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/** Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * completes the slow-path part of a connection
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_tx_complete_tcp_sp(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_con_t * con)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t complete_ramrod;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t sp_type,sp_flags,flags,snapshot_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_slow_path_request_t * request = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snapshot_flags = con->dpc_info.snapshot_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags & LM_TCP_DPC_RESET_RECV) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~LM_TCP_DPC_RESET_RECV;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_tx_rst_received_complete(pdev, con->tcp_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags & LM_TCP_DPC_RAMROD_CMP) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* clean the dpc_info: we're done with it */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* all ramrod on SCQ also complete on RCQ*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi complete_ramrod = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* save the type under the lock because the next ramrod will change this type ???*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_type = tcp->sp_request->type;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(sp_type) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_ABORTIVE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_tx_abortive_disconnect_ramrod_complete(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_INVALIDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_tx_invalidate_ramrod_complete(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_TERMINATE1_OFFLOAD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_tx_terminate_ramrod_complete(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_LOCAL_FIN_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_REMOTE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_TX_RST:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_tx_empty_ramrod_complete(pdev, tcp, sp_type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "unexpected sp completion type=%d\n", tcp->sp_request->type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* save the type under the lock because the next ramrod will change this type */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(sp_type != tcp->sp_request->type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags |= SP_REQUEST_COMPLETED_TX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If it's a second comletion, post the query ramrod */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( tcp->sp_flags & SP_REQUEST_COMPLETED_RX ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi complete_ramrod = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags &= ~ ( SP_REQUEST_COMPLETED_TX | SP_REQUEST_COMPLETED_RX );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_flags = tcp->sp_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi flags = tcp->tx_con->flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (complete_ramrod) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi request = tcp->sp_request;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(request == NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(sp_type) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_ABORTIVE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(request->type != SP_REQUEST_ABORTIVE_DISCONNECT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_comp_abortive_disconnect_request(pdev, tcp, request);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_RESET_SEND, tcp->ulp_type, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_INVALIDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(request->type != SP_REQUEST_INVALIDATE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_comp_invalidate_request(pdev, tcp, request);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_INVALIDATE, tcp->ulp_type, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_TERMINATE1_OFFLOAD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(request->type != SP_REQUEST_TERMINATE1_OFFLOAD);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_terminate_ramrod_complete(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_TERMINATE, tcp->ulp_type, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_LOCAL_FIN_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_REMOTE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_TX_RST:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_comp_empty_ramrod_request(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_EMPTY_RAMROD, tcp->ulp_type, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "unexpected sp completion type=%d\n", tcp->sp_request->type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/** Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * completes the slow-path part of a connection
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * completes ramrods if ramrod is completed.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * function logic: every stage 'turns' of it's flag, if at the end of the check the flags is zero
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * it means there is nothing left to do and we can return. Usually, we will rarely have a case of more
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * than one/two flags on, therefore it seems useless to check all the cases (too many if/jumps)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_rx_complete_tcp_sp(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_tcp_con_t * con
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t complete_ramrod;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t sp_type,sp_flags,flags,snapshot_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_slow_path_request_t * request = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t ulp_type;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* handle fin recv */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi snapshot_flags = con->dpc_info.snapshot_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags & LM_TCP_DPC_FIN_RECV) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_fin_received_complete(pdev, tcp, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~LM_TCP_DPC_FIN_RECV;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags & LM_TCP_DPC_FIN_RECV_UPL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_fin_received_complete(pdev, tcp, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~LM_TCP_DPC_FIN_RECV_UPL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4rx, "lm_tcp_rx_complete_tcp_sp tcp=%p cid=%d \n", tcp, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* reset recv needs to be checked first */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags & LM_TCP_DPC_RESET_RECV) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~LM_TCP_DPC_RESET_RECV;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_rst_received_complete(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check if we have some sort of retrieve indication. we sort of check twice */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Rx completions (from ustorm) will not arrive after the following indications,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * therefore, we can assume, they were received before
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * can't assume the same for ramrods */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags & (LM_TCP_DPC_URG | LM_TCP_DPC_RT_TO | LM_TCP_DPC_KA_TO | LM_TCP_DPC_DBT_RE | LM_TCP_DPC_OPT_ERR | LM_TCP_DPC_UPLD_CLOSE)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~(LM_TCP_DPC_TOO_BIG_ISLE | LM_TCP_DPC_TOO_MANY_ISLES);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags & LM_TCP_DPC_URG) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~LM_TCP_DPC_URG;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_process_retrieve_indication_cqe(pdev, tcp, L4_UPLOAD_REASON_URG);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags & LM_TCP_DPC_RT_TO) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~LM_TCP_DPC_RT_TO;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_process_retrieve_indication_cqe(pdev, tcp, L4_UPLOAD_REASON_RETRANSMIT_TIMEOUT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags & LM_TCP_DPC_KA_TO) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~LM_TCP_DPC_KA_TO;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_upld_close_received_complete(pdev, tcp, L4_UPLOAD_REASON_KEEP_ALIVE_TIMEOUT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags & LM_TCP_DPC_DBT_RE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~LM_TCP_DPC_DBT_RE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_process_retrieve_indication_cqe(pdev, tcp, L4_UPLOAD_REASON_UPLOAD_REQUESTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_dbt_upld_requested++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags & LM_TCP_DPC_OPT_ERR) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~LM_TCP_DPC_OPT_ERR;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_process_retrieve_indication_cqe(pdev, tcp, L4_UPLOAD_REASON_UPLOAD_REQUESTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_opt_upld_requested++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags & LM_TCP_DPC_UPLD_CLOSE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~LM_TCP_DPC_UPLD_CLOSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_upld_close_received_complete(pdev, tcp, L4_UPLOAD_REASON_UPLOAD_REQUESTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if (con->dpc_info.snapshot_flags & LM_TCP_DPC_TOO_BIG_ISLE) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~(LM_TCP_DPC_TOO_BIG_ISLE | LM_TCP_DPC_TOO_MANY_ISLES);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_process_retrieve_indication_cqe(pdev, tcp, L4_UPLOAD_REASON_UPLOAD_REQUESTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_big_isle_upld_requesed++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if (con->dpc_info.snapshot_flags & LM_TCP_DPC_TOO_MANY_ISLES) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~LM_TCP_DPC_TOO_MANY_ISLES;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_process_retrieve_indication_cqe(pdev, tcp, L4_UPLOAD_REASON_UPLOAD_REQUESTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_many_isles_upld_requesed++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (con->dpc_info.snapshot_flags & LM_TCP_DPC_RAMROD_CMP) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con->dpc_info.snapshot_flags &= ~LM_TCP_DPC_RAMROD_CMP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(con->dpc_info.snapshot_flags != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Keep these before completing as the completion calls themselves can cause tcp state to be
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * deleted... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid = tcp->cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ulp_type = tcp->ulp_type;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (tcp->sp_request->type) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_NEIGH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_PATH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_TCP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_UPDATE_PATH_RELINK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_update_ramrod_complete(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_UPDATE, ulp_type, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_QUERY:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_query_ramrod_complete(pdev, tcp); /* this may delete tcp !! */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_QUERY, ulp_type, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_TERMINATE_OFFLOAD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_searcher_ramrod_complete(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_SEARCHER_DELETE, ulp_type, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_INITIATE_OFFLOAD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Completion of initiate offload request can reach this point only if there was a license error, */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* otherwise its being completed earlier during 'process' stage */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_comp_initiate_offload_request(pdev, tcp, TOE_INITIATE_OFFLOAD_RAMROD_DATA_LICENSE_FAILURE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_INITIATE_OFFLOAD, tcp->ulp_type, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* The rest of the ramrods on RCQ also complete on SCQ */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi complete_ramrod = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* save the type under the lock because the next ramrod will change this type ????*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_type = tcp->sp_request->type;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(sp_type) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_ABORTIVE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_abortive_disconnect_ramrod_complete(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_INVALIDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_invalidate_ramrod_complete(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_TERMINATE1_OFFLOAD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_terminate_ramrod_complete(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_LOCAL_FIN_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_REMOTE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_TX_RST:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_rx_empty_ramrod_complete(pdev,tcp, sp_type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "unexpected sp completion type=%d\n", tcp->sp_request->type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Get global TOE lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(sp_type != tcp->sp_request->type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags |= SP_REQUEST_COMPLETED_RX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If it's a second comletion, post the query ramrod */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( tcp->sp_flags & SP_REQUEST_COMPLETED_TX ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi complete_ramrod = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->sp_flags &= ~ ( SP_REQUEST_COMPLETED_TX | SP_REQUEST_COMPLETED_RX );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_flags = tcp->sp_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi flags = tcp->rx_con->flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (complete_ramrod) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi request = tcp->sp_request;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(request == NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(sp_type) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_ABORTIVE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(request->type != SP_REQUEST_ABORTIVE_DISCONNECT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_comp_abortive_disconnect_request(pdev, tcp, request);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_RESET_SEND, tcp->ulp_type, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_INVALIDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(request->type != SP_REQUEST_INVALIDATE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_comp_invalidate_request(pdev, tcp, request);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_INVALIDATE, tcp->ulp_type, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_TERMINATE1_OFFLOAD:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(request->type != SP_REQUEST_TERMINATE1_OFFLOAD);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_terminate_ramrod_complete(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_TERMINATE, tcp->ulp_type, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_LOCAL_FIN_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_REMOTE_DISCONNECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case SP_REQUEST_PENDING_TX_RST:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_comp_empty_ramrod_request(pdev, tcp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_OPCODE_TOE_EMPTY_RAMROD, tcp->ulp_type, tcp->cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "unexpected sp completion type=%d\n", tcp->sp_request->type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define MSL 4 /* 4 seconds */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchil4_tcp_con_state_t lm_tcp_calc_state (
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t fin_was_sent
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi enum {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NO_CLOSE = 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ACTIVE_CLOSE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PASSIVE_CLOSE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PASSIVE_BY_ACTIVE_CLOSE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } closing_type;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t snd_max = tcp->tcp_delegated.send_max;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t snd_una = tcp->tcp_delegated.send_una;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t con_rst = tcp->tcp_state_calc.con_rst_flag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t con_upld_close = tcp->tcp_state_calc.con_upld_close_flag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u64_t fin_completed_time = tcp->tcp_state_calc.fin_completed_time;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u64_t fin_reception_time = tcp->tcp_state_calc.fin_reception_time;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u64_t fin_request_time = tcp->tcp_state_calc.fin_request_time;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u64_t time_wait_state_entering_time = fin_completed_time > fin_reception_time ?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi fin_completed_time : fin_reception_time;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l4_tcp_con_state_t tcp_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Set closing type */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi closing_type = NO_CLOSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( fin_reception_time == 0 ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( fin_request_time > 0 ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi closing_type = ACTIVE_CLOSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if ( ( fin_reception_time < fin_request_time ) || (fin_request_time == 0) ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi closing_type = PASSIVE_CLOSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if ( ( fin_reception_time >= fin_request_time ) && (fin_request_time > 0) ){
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi closing_type = PASSIVE_BY_ACTIVE_CLOSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((con_rst) || (con_upld_close)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = L4_TCP_CON_STATE_CLOSED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if ( closing_type == NO_CLOSE ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = L4_TCP_CON_STATE_ESTABLISHED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if ( ( closing_type == ACTIVE_CLOSE ) && fin_was_sent ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( snd_una == snd_max ){
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = L4_TCP_CON_STATE_FIN_WAIT2;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = L4_TCP_CON_STATE_FIN_WAIT1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if ( ( closing_type == PASSIVE_BY_ACTIVE_CLOSE ) && (! fin_was_sent ) ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = L4_TCP_CON_STATE_CLOSE_WAIT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if (closing_type == PASSIVE_BY_ACTIVE_CLOSE ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (snd_una == snd_max) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( mm_get_current_time(pdev) - time_wait_state_entering_time > 2*pdev->ofld_info.l4_params.ticks_per_second *MSL ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = L4_TCP_CON_STATE_CLOSED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = L4_TCP_CON_STATE_TIME_WAIT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = L4_TCP_CON_STATE_CLOSING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if (closing_type == PASSIVE_CLOSE ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( ! fin_was_sent ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = L4_TCP_CON_STATE_CLOSE_WAIT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if ( snd_una == snd_max ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = L4_TCP_CON_STATE_CLOSED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = L4_TCP_CON_STATE_LAST_ACK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = L4_TCP_CON_STATE_ESTABLISHED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return tcp_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_clear_grqs(lm_device_t * pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_grq_t * grq;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// lm_tcp_gen_buf_t * gen_buf;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(pdev->params.ofld_cap & LM_OFFLOAD_CHIMNEY));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* shutdown bug - BSOD only if shutdown is not in progress */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!lm_reset_is_inprogress(pdev)){
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!d_list_is_empty(&pdev->toe_info.state_blk.tcp_list));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!d_list_is_empty(&pdev->toe_info.state_blk.path_list));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!d_list_is_empty(&pdev->toe_info.state_blk.neigh_list));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* we need to go over all the buffers in the GRQs and return them to the pool. We also need
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to clear the consumer- of the grq in the FWto make sure this grq isn't treated in the xon test. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This function is called after all work - items have finished, and the driver
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * state is no longer running, therefore there is no risk at accessing the grqs without
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * a lock */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(USTORM_TOE_GRQ_CONS_PTR_LO_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(USTORM_TOE_GRQ_CONS_PTR_HI_SIZE != 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FOREACH_RSS_IDX(pdev, idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq = &pdev->toe_info.grqs[idx];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_GRQ_LOCK(pdev, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq->grq_compensate_on_alloc = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_GRQ_LOCK(pdev, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FOREACH_RSS_IDX(pdev, idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* nullify consumer pointer of all inactive GRQs (required by FW) (will override with active ones) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, USTORM_TOE_GRQ_CONS_PTR_LO_OFFSET(LM_TOE_FW_RSS_ID(pdev,idx), PORT_ID(pdev)), 0, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, USTORM_TOE_GRQ_CONS_PTR_HI_OFFSET(LM_TOE_FW_RSS_ID(pdev,idx), PORT_ID(pdev)), 0, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi grq = &pdev->toe_info.grqs[idx];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!d_list_is_empty(&grq->aux_gen_list)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_return_list_of_gen_bufs(pdev, &grq->aux_gen_list, 0, NON_EXISTENT_SB_IDX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_clear(&grq->aux_gen_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!d_list_is_empty(&grq->active_gen_list)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_tcp_return_list_of_gen_bufs(pdev, &grq->active_gen_list, 0, NON_EXISTENT_SB_IDX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_clear(&grq->active_gen_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_reset(pdev, &grq->bd_chain);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description: Update TOE RSS. The origin of this call is when getting
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * an OS RSS update. It's actually by L2 interface and not
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * L4. However, the ramrods are separate for L4 + L2 due to the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * assumptions by the different protocols of what the data is
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * in the indirection table.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Assumptions: Called BEFORE calling L2
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * enable-rss!!
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param chain_indirection_table - table of TOE RCQ chain values
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param table_size - size of table above
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param enable - is this enable/disable rss if it's disable, the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * table will all point to the same entry
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t - PENDING is completion will arrive asyncrounoulsy
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - SUCCESS if no ramrod is sent (for example table didn't change)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - FAILURE o/w
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_tcp_update_rss(struct _lm_device_t * pdev, u8_t * chain_indirection_table,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t table_size, u8_t enable)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct toe_rss_update_ramrod_data *data = pdev->toe_info.rss_update_data;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t value = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t send_ramrod = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t rss_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t bitmap = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t i,j;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If data is NULL (allocation failed...) we don't want to fail this operation for L2 */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_enable_rss == L4_RSS_DISABLED || data == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->params.l4_enable_rss != L4_RSS_DYNAMIC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (enable)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_grq_page_cnt > 2)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FOREACH_RSS_IDX(pdev, rss_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.grqs[rss_idx].high_bds_threshold = 2 * 512;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.grqs[LM_TOE_BASE_RSS_ID(pdev)].high_bds_threshold = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (j = 0; j < TOE_INDIRECTION_TABLE_SIZE/table_size; j++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < table_size; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = LM_TOE_FW_RSS_ID(pdev,chain_indirection_table[i]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->toe_info.indirection_table[(j*table_size)+i] != value) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.indirection_table[(j*table_size)+i] = value;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi send_ramrod = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* send update ramrod */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (send_ramrod)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.update_comp_cnt = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.update_suspend_cnt = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.update_toe_comp_cnt = 0; /* We need a separate one for TOE to determine when to update sq credit */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* 2 global update counters :
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * update_comp_cnt - Set initialy to the number of expected completions, decrmented every time an update completion is processed.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The processing for all chains is suspended until this counter gets to 0.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * update_suspend_cnt - Set initialy to the number of potentially suspended chains. Decremented when each chain resumes processing. The ramrod completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * is indicated back only when this counter gets to 0.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The update ramrod is 1 pending so we can access the completion and suspend counters here and below without grabbing a lock
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Update once for Eth... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.update_comp_cnt++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.update_suspend_cnt++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TODO: Enhancment, send only on the chains that take part, and the ones removed... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FOREACH_RSS_IDX(pdev, rss_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bitmap |= (1<<LM_TOE_FW_RSS_ID(pdev,rss_idx));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(data->indirection_table, pdev->toe_info.indirection_table, sizeof(data->indirection_table));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->toe_rss_bitmap = bitmap;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.update_comp_cnt += pdev->params.l4_rss_chain_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.update_suspend_cnt += pdev->params.l4_rss_chain_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.update_toe_comp_cnt = pdev->params.l4_rss_chain_cnt; /* TOE only! */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_command_post(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FW_RSS_ID(pdev, LM_TOE_BASE_RSS_ID(pdev)),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_OPCODE_TOE_RSS_UPDATE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_MEDIUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi TOE_CONNECTION_TYPE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.rss_update_data_phys.as_u64);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status == LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/** Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * function is called whenever the UM allocates more generic buffers
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_rx_gen_bufs_alloc_cb(lm_device_t * pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t i;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TOE_FOREACH_RSS_IDX(pdev, i)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_grq_t *grq = &pdev->toe_info.grqs[i];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_TOE_GRQ_LOCK(pdev, i);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (grq->grq_compensate_on_alloc) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* fill GRQ */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_tcp_rx_fill_grq(pdev, i, NULL, FILL_GRQ_LOW_THRESHOLD)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl4rx, "lm_toe_service_rx_intr: Updating GRQ producer\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* notify the fw of the prod of the GRQ */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev, USTORM_TOE_GRQ_PROD_OFFSET(LM_TOE_FW_RSS_ID(pdev,i), PORT_ID(pdev)),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_prod_idx(&pdev->toe_info.grqs[i].bd_chain), BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_TOE_GRQ_LOCK(pdev, i);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_update_isles_cnts(struct _lm_device_t * pdev, s16_t number_of_isles, s32_t number_of_gen_bufs)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_toe_isles_t *archipelago = &pdev->toe_info.archipelago;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.archipelago.number_of_isles += number_of_isles;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.archipelago.gen_bufs_in_isles += number_of_gen_bufs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (archipelago->number_of_isles > archipelago->max_number_of_isles) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi archipelago->max_number_of_isles = archipelago->number_of_isles;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (archipelago->gen_bufs_in_isles > archipelago->max_gen_bufs_in_isles) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi archipelago->max_gen_bufs_in_isles = archipelago->gen_bufs_in_isles;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_max_gen_bufs_in_archipelago
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi && (archipelago->gen_bufs_in_isles > (s32_t)pdev->params.l4_max_gen_bufs_in_archipelago)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_limit_isles & L4_LI_NOTIFY) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l4_limit_isles & L4_LI_MAX_GEN_BUFS_IN_ARCHIPELAGO) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.archipelago.l4_decrease_archipelago = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else if (pdev->toe_info.archipelago.l4_decrease_archipelago) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (archipelago->gen_bufs_in_isles <= (s32_t)pdev->params.l4_valid_gen_bufs_in_archipelago) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.archipelago.l4_decrease_archipelago = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_init_num_of_blocks_per_connection(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t num)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.l4_num_of_blocks_per_connection = num;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_tcp_get_num_of_blocks_per_connection(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return pdev->params.l4_num_of_blocks_per_connection;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_neigh_state_t * lm_tcp_get_next_neigh(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_neigh_state_t * neigh_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (neigh_state == NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh_state = (lm_neigh_state_t *) d_list_peek_head(&pdev->toe_info.state_blk.neigh_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi neigh_state = (lm_neigh_state_t *) d_list_next_entry(&neigh_state->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return neigh_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_path_state_t * lm_tcp_get_next_path(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_neigh_state_t * neigh_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_path_state_t * path_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (path_state == NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path_state = (lm_path_state_t *) d_list_peek_head(&pdev->toe_info.state_blk.path_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path_state = (lm_path_state_t *) d_list_next_entry(&path_state->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (neigh_state != NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while(path_state) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (path_state->neigh == neigh_state) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return path_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi path_state = (lm_path_state_t *) d_list_next_entry(&path_state->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return path_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_tcp_state_t * lm_tcp_get_next_tcp(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tcp_state == NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = (lm_tcp_state_t *) d_list_peek_head(&pdev->toe_info.state_blk.tcp_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp_state = (lm_tcp_state_t *) d_list_next_entry(&tcp_state->hdr.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return tcp_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_tcp_get_src_ip_cam_byte(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_path_state_t * path)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t src_ip_byte;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(pdev && path));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (path->path_const.ip_version == IP_VERSION_IPV4) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi src_ip_byte = path->path_const.u.ipv4.src_ip & 0x000000FF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi src_ip_byte = path->path_const.u.ipv6.src_ip[0] & 0x000000FF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return src_ip_byte;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_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)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *connection_found = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t *current_tcp = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while ((current_tcp = lm_tcp_get_next_tcp(pdev, prev_tcp))) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t c_src_tcp_b;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t c_dst_tcp_b;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi prev_tcp = current_tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi c_src_tcp_b = current_tcp->tcp_const.src_port & 0x00FF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi c_dst_tcp_b = current_tcp->tcp_const.dst_port & 0x00FF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((c_src_tcp_b == src_tcp_b) && (c_dst_tcp_b == dst_tcp_b)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((current_tcp->path == NULL) || (lm_tcp_get_src_ip_cam_byte(pdev,current_tcp->path) == src_ip_byte)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi connection_found = current_tcp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return connection_found;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t * lm_tcp_get_pattern(struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t pattern_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t offset,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t * pattern_size)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi offset = tcp->integrity_info.current_offset_in_pattern_buf[pattern_idx] + offset;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi offset = offset % pdev->toe_info.integrity_info.pattern_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (*pattern_size > (pdev->toe_info.integrity_info.pattern_buf_size - pdev->toe_info.integrity_info.pattern_size)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *pattern_size = pdev->toe_info.integrity_info.pattern_buf_size - pdev->toe_info.integrity_info.pattern_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return (pdev->toe_info.integrity_info.pattern_buf + offset);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_tcp_set_pattern_offset(struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tcp_state_t * tcp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t pattern_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t offset)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->integrity_info.current_offset_in_pattern_buf[pattern_idx] += offset;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->integrity_info.current_offset_in_pattern_buf[pattern_idx] =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcp->integrity_info.current_offset_in_pattern_buf[pattern_idx] % pdev->toe_info.integrity_info.pattern_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t lm_tcp_find_pattern_offset(struct _lm_device_t * pdev, u8_t * sub_buf, u32_t sub_buf_size)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t i,j;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (j = 0; j < pdev->toe_info.integrity_info.pattern_size; j++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < sub_buf_size; i++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (sub_buf[i] != pdev->toe_info.integrity_info.pattern_buf[j+i]) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (i == sub_buf_size) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return j;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0xFFFFFFFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}