d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*******************************************************************************
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * CDDL HEADER START
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The contents of this file are subject to the terms of the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Common Development and Distribution License (the "License").
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You may not use this file except in compliance with the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * or http://www.opensolaris.org/os/licensing.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * See the License for the specific language governing permissions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and limitations under the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * When distributing Covered Code, include this CDDL HEADER in each
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * If applicable, add the following below this CDDL HEADER, with the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * fields enclosed by brackets "[]" replaced with your own identifying
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * information: Portions Copyright [yyyy] [name of copyright owner]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * CDDL HEADER END
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Copyright 2014 QLogic Corporation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The contents of this file are subject to the terms of the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * QLogic End User License (the "License").
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You may not use this file except in compliance with the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * You can obtain a copy of the License at
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * QLogic_End_User_Software_License.txt
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * See the License for the specific language governing permissions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and limitations under the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Module Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This file contains the implementation of slow-path operations
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * for L2 + Common. It uses ecore_sp_verbs in most cases.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "lm5710.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if !defined(__LINUX) && !defined(__SunOS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// disable warning C4127 (conditional expression is constant)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// for this file (relevant when compiling with W4 warning level)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#pragma warning( disable : 4127 )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* __LINUX */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if !defined(__LINUX) && !defined(__SunOS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#pragma warning( default : 4127 )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "mm.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "context.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "command.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "bd_chain.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "ecore_common.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "ecore_sp_verbs.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "debug.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitypedef enum _ecore_status_t ecore_status_t;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_empty_ramrod_eth(IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u32_t cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t data_cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN volatile u32_t *curr_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t new_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi union eth_specific_data ramrod_data = {{0}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_empty_ramrod_eth_conn, curr_state=%d\n",curr_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(sizeof(ramrod_data) == sizeof(u64_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //Prepare ramrod data
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_data.update_data_addr.lo = data_cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_data.update_data_addr.hi = 0 ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Send Empty ramrod.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_sq_post(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_ETH_EMPTY,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_MEDIUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ETH_CONNECTION_TYPE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(u64_t *)&ramrod_data );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* curr_state may be NULL incase wait isn't required */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (curr_state != NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_wait_state_change(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi curr_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi new_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((lm_status != LM_STATUS_SUCCESS) && (lm_status != LM_STATUS_ABORTED))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_empty_ramrod_eth: lm_wait_state_change failed");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_empty_ramrod_eth */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_ecore_status_to_lm_status( const ecore_status_t ecore_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (ecore_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ECORE_SUCCESS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ECORE_TIMEOUT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_TIMEOUT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ECORE_INVAL:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ECORE_BUSY:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_BUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ECORE_NOMEM:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ECORE_PENDING:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ECORE_EXISTS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_EXISTING_OBJECT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ECORE_IO:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("Unknwon ecore_status_t");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_is_eq_completion(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_chain_t * eq_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t result = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pdev || IS_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi eq_chain = &pdev->eq_info.eq_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( eq_chain->hw_con_idx_ptr && (mm_le16_to_cpu(*eq_chain->hw_con_idx_ptr) != lm_bd_chain_cons_idx(&eq_chain->bd_chain)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi result = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMeq, "lm_is_eq_completion: result is:%s\n", result? "TRUE" : "FALSE");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return result;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiSTATIC lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_eth_init_client_init_general_data(IN lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT struct client_init_general_data *general,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t stats_cnt_id = LM_STATS_CNT_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t is_pfdev = IS_PFDEV(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t reg_cid = (u8_t)lm_mp_get_reg_chain_from_chain(pdev,cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t cos = lm_mp_cos_from_chain(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t traffic_type = LM_CHAIN_IDX_TRAFFIC_TYPE(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LLFC_DRIVER_TRAFFIC_TYPE_MAX == traffic_type)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_eth_init_client_init_general_data failed ");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* General Structure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi general->activate_flg = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi general->client_id = LM_FW_CLI_ID(pdev, reg_cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi general->is_fcoe_flg = (cid == FCOE_CID(pdev))? TRUE : FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi general->statistics_en_flg = (is_pfdev || (stats_cnt_id != 0xFF))? TRUE : FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi general->statistics_counter_id = (general->statistics_en_flg)? stats_cnt_id : DISABLE_STATISTIC_COUNTER_ID_VALUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi general->sp_client_id = LM_FW_CLI_ID(pdev, reg_cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi general->mtu = mm_cpu_to_le16((u16_t)pdev->params.l2_cli_con_params[cid].mtu);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi general->func_id = FUNC_ID(pdev); /* FIXME: VFID needs to be given here for VFs... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Don't care data for Non cos clients
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(lm_chain_type_not_cos == lm_mp_get_chain_type(pdev,cid))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // FW requires a valid COS number
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi general->cos = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi general->cos = cos;//The connection cos, if applicable only if STATIC_COS is set
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi general->traffic_type = traffic_type;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TODO: using path_has_ovlan for finding if it is UFP/BD mode or not is correct?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * does this needs to be done even in lm_vf.c lm_vf_pf_acquire_msg
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * function? Also how do we handle the check in lm_pf_vf_check_compatibility
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(IS_MF_SD_MODE(pdev) && (IS_SD_UFP_MODE(pdev) || IS_SD_BD_MODE(pdev)) && general->is_fcoe_flg)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi general->fp_hsi_ver = ETH_FP_HSI_VER_2;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi general->fp_hsi_ver = ETH_FP_HSI_VER_1; // default is v1 since only when conditions above are true HSI is v2
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiSTATIC void
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_eth_init_client_init_rx_data(IN lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT struct client_init_rx_data *rx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t sb_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t * rx_chain_sge = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t * rx_chain_bd = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t rel_cid = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(cid == FWD_CID(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_chain_sge = LM_RXQ_SGE_PTR_IF_VALID(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_chain_bd = &LM_RXQ_CHAIN_BD(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->status_block_id = LM_FW_SB_ID(pdev, sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // TPA is enabled in run time.(TPA is disabled in init time)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->tpa_en = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->max_agg_size = mm_cpu_to_le16(0); /* TPA related only */;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->max_tpa_queues = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->extra_data_over_sgl_en_flg = (cid == OOO_CID(pdev))? TRUE : FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->cache_line_alignment_log_size = (u8_t)LOG2(CACHE_LINE_SIZE/* TODO mm_get_cache_line_alignment()*/);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->enable_dynamic_hc = (u8_t)pdev->params.enable_dynamic_hc[HC_INDEX_ETH_RX_CQ_CONS];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->outer_vlan_removal_enable_flg = IS_MULTI_VNIC(pdev)? TRUE: FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(OOO_CID(pdev) == cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->inner_vlan_removal_enable_flg = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->inner_vlan_removal_enable_flg = !pdev->params.keep_vlan_tag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(IS_MF_AFEX_MODE(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // In NIV we must remove default VLAN.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->silent_vlan_removal_flg = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->silent_vlan_value = mm_cpu_to_le16(NIV_DEFAULT_VLAN(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->silent_vlan_mask = mm_cpu_to_le16(ETHERNET_VLAN_ID_MASK);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->bd_page_base.lo= mm_cpu_to_le32(lm_bd_chain_phys_addr(rx_chain_bd, 0).as_u32.low);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->bd_page_base.hi= mm_cpu_to_le32(lm_bd_chain_phys_addr(rx_chain_bd, 0).as_u32.high);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->cqe_page_base.lo = mm_cpu_to_le32(lm_bd_chain_phys_addr(&pdev->rx_info.rcq_chain[cid].bd_chain, 0).as_u32.low);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->cqe_page_base.hi = mm_cpu_to_le32(lm_bd_chain_phys_addr(&pdev->rx_info.rcq_chain[cid].bd_chain, 0).as_u32.high);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid == LM_SW_LEADING_RSS_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TODO: for now... doesn't have to be leading cid, anyone can get the approx mcast... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->is_leading_rss = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->is_approx_mcast = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->approx_mcast_engine_id = FUNC_ID(pdev); /* FIMXE (MichalS) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->rss_engine_id = FUNC_ID(pdev); /* FIMXE (MichalS) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(rx_chain_sge)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* override bd_buff_size if we are in LAH enabled mode */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->max_bytes_on_bd = mm_cpu_to_le16((u16_t)pdev->params.l2_cli_con_params[cid].lah_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->vmqueue_mode_en_flg = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->max_sges_for_packet = LM_MAX_SGES_FOR_PACKET;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->sge_buff_size = mm_cpu_to_le16(MAX_L2_CLI_BUFFER_SIZE(pdev, cid) - (u16_t)pdev->params.l2_cli_con_params[cid].lah_size - (u16_t)pdev->params.rcv_buffer_offset - CACHE_LINE_SIZE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->sge_page_base.hi = mm_cpu_to_le32(lm_bd_chain_phys_addr(rx_chain_sge, 0).as_u32.high);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->sge_page_base.lo = mm_cpu_to_le32(lm_bd_chain_phys_addr(rx_chain_sge, 0).as_u32.low);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->max_bytes_on_bd = mm_cpu_to_le16(MAX_L2_CLI_BUFFER_SIZE(pdev, cid) - (u16_t)pdev->params.rcv_buffer_offset - CACHE_LINE_SIZE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->vmqueue_mode_en_flg = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->max_sges_for_packet = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->sge_buff_size = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->sge_page_base.hi = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->sge_page_base.lo = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid == OOO_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rel_cid = cid - LM_MAX_RSS_CHAINS(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->client_qzone_id = LM_FW_AUX_QZONE_ID(pdev, rel_cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->rx_sb_index_number = HC_SP_INDEX_ISCSI_OOO_RX_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid == ISCSI_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rel_cid = cid - LM_MAX_RSS_CHAINS(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->client_qzone_id = LM_FW_AUX_QZONE_ID(pdev, rel_cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->rx_sb_index_number = HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid == FCOE_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rel_cid = cid - LM_MAX_RSS_CHAINS(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->client_qzone_id = LM_FW_AUX_QZONE_ID(pdev, rel_cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->rx_sb_index_number = HC_SP_INDEX_ETH_FCOE_RX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid < MAX_RX_CHAIN(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->client_qzone_id = LM_FW_DHC_QZONE_ID(pdev, sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->rx_sb_index_number = HC_INDEX_ETH_RX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(NULL, FATAL, "Invalid cid 0x%x.\n", cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Avoiding rings thresholds verification is aimed for eVBD
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // which receives its buffers and SGEs only after client init
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // is completed.(eVBD receives the buffers and SGEs only after
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // client setup is completed.)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->dont_verify_rings_pause_thr_flg = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* FC */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l2_fw_flow_ctrl)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t desired_cqe_bd_low_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t desired_cqe_bd_high_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t low_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t high_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t next_page_bds;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi next_page_bds = LM_RXQ_CHAIN_BD(pdev, cid).bds_skip_eop * LM_RXQ_CHAIN_BD(pdev, cid).page_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi desired_cqe_bd_low_thresh = BRB_SIZE(pdev) + next_page_bds + FW_DROP_LEVEL(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi desired_cqe_bd_high_thresh = desired_cqe_bd_low_thresh + DROPLESS_FC_HEADROOM;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi low_thresh = mm_cpu_to_le16(min(desired_cqe_bd_low_thresh, (u16_t)((LM_RXQ(pdev, cid).common.desc_cnt)/4)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi high_thresh = mm_cpu_to_le16(min(desired_cqe_bd_high_thresh, (u16_t)((LM_RXQ(pdev, cid).common.desc_cnt)/2)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->cqe_pause_thr_low = low_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->bd_pause_thr_low = low_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->sge_pause_thr_low = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->rx_cos_mask = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->cqe_pause_thr_high = high_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->bd_pause_thr_high = high_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx->sge_pause_thr_high = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiSTATIC void
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_eth_init_client_init_tx_data(IN lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi OUT struct client_init_tx_data *tx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t sb_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Status block index init we do for Rx + Tx together so that we ask which cid we are only once */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid == FWD_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tx_sb_index_number = HC_SP_INDEX_ETH_FW_TX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid == OOO_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // OOO CID doesn't really has a TX client this is don't
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // care data for FW.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tx_sb_index_number = HC_SP_INDEX_NOT_USED; /* D/C */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid == ISCSI_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tx_sb_index_number = HC_SP_INDEX_ETH_ISCSI_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid == FCOE_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tx_sb_index_number = HC_SP_INDEX_ETH_FCOE_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_MF_AFEX_MODE(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->force_default_pri_flg = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (lm_chain_type_not_cos != lm_mp_get_chain_type(pdev, cid))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // This isn't realy cid it is the chain index
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tx_sb_index_number = lm_eth_tx_hc_cq_cons_cosx_from_chain(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(NULL, FATAL, "Invalid cid 0x%x.\n", cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TX Data (remaining , sb index above...) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* ooo cid doesn't have a tx chain... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid != OOO_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tx_bd_page_base.hi = mm_cpu_to_le32(lm_bd_chain_phys_addr(&pdev->tx_info.chain[cid].bd_chain, 0).as_u32.high);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tx_bd_page_base.lo = mm_cpu_to_le32(lm_bd_chain_phys_addr(&pdev->tx_info.chain[cid].bd_chain, 0).as_u32.low);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tx_status_block_id = LM_FW_SB_ID(pdev, sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->enforce_security_flg = FALSE; /* TBD: turn on for KVM VF? */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Tx Switching... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_MF_SI_MODE(pdev) && pdev->params.npar_vm_switching_enable &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (cid != FWD_CID(pdev)) && (cid != FCOE_CID(pdev)) && (cid != ISCSI_CID(pdev)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tx_switching_flg = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tx_switching_flg = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tss_leading_client_id = LM_FW_CLI_ID(pdev, LM_SW_LEADING_RSS_CID(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->refuse_outband_vlan_flg = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // for encapsulated packets
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // the hw ip header will be the inner ip header, the hw will incremnet the inner ip id.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // the fw ip header will be the outer ip header, this means that if the outer ip header is ipv4, its ip id will not be incremented.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tunnel_lso_inc_ip_id = INT_HEADER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // In case of non-Lso encapsulated packets with L4 checksum offload, the pseudo checksum location - on BD
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tunnel_non_lso_pcsum_location = CSUM_ON_BD;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // In case of non-Lso encapsulated packets with outer L3 ip checksum offload, the pseudo checksum location - on BD
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx->tunnel_non_lso_outer_ip_csum_location = CSUM_ON_BD;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t lm_get_sw_client_idx_from_cid(lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t client_info_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If MP is enabled, we need to take care of tx-only connections, which use the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * regular connection client-idx... the rest are split into regular eth
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and vfs... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (MM_DCB_MP_L2_IS_ENABLE(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_chain_type_cos_tx_only == lm_mp_get_chain_type(pdev, cid))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_info_idx = lm_mp_get_reg_chain_from_chain(pdev,cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return client_info_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_CHANNEL_VIRT_MODE_MASTER_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_info_idx = lm_pf_get_sw_client_idx_from_cid(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_info_idx = cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return client_info_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t lm_get_fw_client_idx_from_cid(lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t client_info_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t fw_client_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If MP is enabled, we need to take care of tx-only connections, which use the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * regular connection client-idx... the rest are split into regular eth
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and vfs... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (MM_DCB_MP_L2_IS_ENABLE(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_chain_type_cos_tx_only == lm_mp_get_chain_type(pdev, cid))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_info_idx = lm_mp_get_reg_chain_from_chain(pdev,cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_FW_CLI_ID(pdev, client_info_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_CHANNEL_VIRT_MODE_MASTER_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi fw_client_id = lm_pf_get_fw_client_idx_from_cid(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi fw_client_id = LM_FW_CLI_ID(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return fw_client_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiSTATIC lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_eth_init_tx_queue_data(IN lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t chain_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t sb_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct tx_queue_init_ramrod_data * tx_queue_init_data_virt = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t client_info_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t cid = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if((lm_chain_type_cos_tx_only != lm_mp_get_chain_type(pdev,chain_id)) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (chain_id != FWD_CID(pdev)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_eth_init_tx_queue_data: the chain isn't TX only " );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* a bit redundant, but just so we're clear on terminology... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid = chain_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Since ramrods are sent sequentially for tx only clients, and then regular client, and
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * we won't have a case of these being sent in parallel, we can safely use the client_init_data_virt
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * of the regular eth connection for the tx only connection.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This way, we don't need to allocate client_info for tx only connections.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_info_idx = lm_get_sw_client_idx_from_cid(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_queue_init_data_virt = &(pdev->client_info[client_info_idx].client_init_data_virt->tx_queue);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(tx_queue_init_data_virt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(tx_queue_init_data_virt , sizeof(struct tx_queue_init_ramrod_data));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* General Structure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_eth_init_client_init_general_data(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &(tx_queue_init_data_virt->general),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi chain_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Tx Data */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eth_init_client_init_tx_data(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &(tx_queue_init_data_virt->tx),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi chain_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_eth_init_client_init_data(lm_device_t *pdev, u8_t cid, u8_t sb_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct client_init_ramrod_data * client_init_data_virt = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u32_t client_info_idx = lm_get_sw_client_idx_from_cid(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (client_info_idx >= ARRSIZE(pdev->client_info))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(client_info_idx >= ARRSIZE(pdev->client_info));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt = &(pdev->client_info[client_info_idx].client_init_data_virt->init_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(client_init_data_virt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(client_init_data_virt , sizeof(struct client_init_ramrod_data));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* General Structure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_eth_init_client_init_general_data(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &(client_init_data_virt->general),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Rx Data */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eth_init_client_init_rx_data(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &(client_init_data_virt->rx),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Tx Data */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eth_init_client_init_tx_data(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &(client_init_data_virt->tx),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @assumptions: STRONG ASSUMPTION: This function is not
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * called for SRIOV / MP connections...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_update_eth_client(IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t client_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u16_t silent_vlan_value,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u16_t silent_vlan_mask,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t silent_vlan_removal_flg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t silent_vlan_change_flg
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct client_update_ramrod_data * client_update_data_virt = pdev->client_info[client_idx].update.data_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t con_state = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u32_t cid = client_idx; //lm_get_cid_from_sw_client_idx(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(client_update_data_virt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(client_update_data_virt , sizeof(struct client_update_ramrod_data));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // We will send a client update ramrod in any case we can we don't optimize this flow.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Client setup may already took the correct NIV value but the ramrod will be sent anyway
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con_state = lm_get_con_state(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if((LM_CON_STATE_OPEN != con_state) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (LM_CON_STATE_OPEN_SENT != con_state))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Clinet is not in a state that it can recieve the ramrod
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_ABORTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* We don't expect this function to be called for non eth regular connections.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * If we hit this assert it means we need support for SRIOV + AFEX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid >= MAX_RX_CHAIN(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(cid >= MAX_RX_CHAIN(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( LM_CLI_UPDATE_NOT_USED != pdev->client_info[client_idx].update.state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[client_idx].update.state = LM_CLI_UPDATE_USED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->client_id = LM_FW_CLI_ID(pdev, client_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->func_id = FUNC_ID(pdev); /* FIXME: VFID needs to be given here for VFs... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->silent_vlan_value = mm_cpu_to_le16(silent_vlan_value);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->silent_vlan_mask = mm_cpu_to_le16(silent_vlan_mask);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->silent_vlan_removal_flg = silent_vlan_removal_flg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->silent_vlan_change_flg = silent_vlan_change_flg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->refuse_outband_vlan_flg = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->refuse_outband_vlan_change_flg = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_sq_post(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_ETH_CLIENT_UPDATE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_MEDIUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ETH_CONNECTION_TYPE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[client_idx].update.data_phys.as_u64);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_wait_state_change(pdev, &pdev->client_info[client_idx].update.state, LM_CLI_UPDATE_RECV);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[client_idx].update.state = LM_CLI_UPDATE_NOT_USED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_establish_eth_con(struct _lm_device_t *pdev, u8_t const chain_idx, u8_t sb_id, u8_t attributes_bitmap)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t cmd_id = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t type = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rcq_chain_t* rcq_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t cid = chain_idx; /* redundant, but here for terminology sake... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t client_info_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_establish_eth_con, cid=%d\n",cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, cid, LM_CON_STATE_CLOSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TODO: VF??? */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_CLIENT_ATTRIBUTES_REG_CLI == GET_FLAGS(attributes_bitmap,LM_CLIENT_ATTRIBUTES_REG_CLI ))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Regular client or OOO CID
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( LM_CLIENT_ATTRIBUTES_RX != GET_FLAGS(attributes_bitmap,LM_CLIENT_ATTRIBUTES_RX ));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_eth_init_client_init_data(pdev, cid, sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // TX only client or FWD
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( LM_CLIENT_ATTRIBUTES_RX == GET_FLAGS(attributes_bitmap,LM_CLIENT_ATTRIBUTES_RX ));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_eth_init_tx_queue_data(pdev, cid, sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_establish_eth_con: lm_eth_init_client_init_data or lm_eth_init_tx_queue_data failed \n ");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_init_connection_context(pdev, cid, sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* When we setup the RCQ ring we should advance the CQ cons by MAX_NUM_RAMRODS - the FWD CID is the only connection without an RCQ
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * therefore we skip this operation for forward */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_CLIENT_ATTRIBUTES_REG_CLI == GET_FLAGS(attributes_bitmap,LM_CLIENT_ATTRIBUTES_REG_CLI ))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( LM_CLIENT_ATTRIBUTES_RX != GET_FLAGS(attributes_bitmap,LM_CLIENT_ATTRIBUTES_RX ));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmd_id = RAMROD_CMD_ID_ETH_CLIENT_SETUP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain = &LM_RCQ(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_bds_produced(&rcq_chain->bd_chain, ETH_MIN_RX_CQES_WITH_TPA_E1H_E2);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( LM_CLIENT_ATTRIBUTES_RX == GET_FLAGS(attributes_bitmap,LM_CLIENT_ATTRIBUTES_RX ));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid == FWD_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmd_id = RAMROD_CMD_ID_ETH_FORWARD_SETUP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if(lm_chain_type_cos_tx_only == lm_mp_get_chain_type(pdev,cid))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmd_id = RAMROD_CMD_ID_ETH_TX_QUEUE_SETUP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg(" lm_establish_eth_con: cmd_id not set ");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Move to state ramrod sent must be done before ramrod is realy sent
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, cid, LM_CON_STATE_OPEN_SENT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_info_idx = lm_get_sw_client_idx_from_cid(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_sq_post(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmd_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_MEDIUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi type,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[client_info_idx].client_init_data_phys.as_u64);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_vf_queue_init(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, cid, LM_CON_STATE_CLOSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_eth_wait_state_change(pdev, LM_CON_STATE_OPEN, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_establish_eth_con */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Send all the ramrods and wait for there return.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param chain_idx_base
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * status success is returned if all the ramrods where received.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Status failure is returned if not all the ramrods were
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * received.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_tpa_send_ramrods_wait(IN lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t chain_idx_base)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tpa_info_t *tpa_info = &LM_TPA_INFO(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(NULL != tpa_info->update_cookie);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(0 != tpa_info->ramrod_recv_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tpa_send_ramrods(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi chain_idx_base);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg(" Ramrod send failed ");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_wait_state_change(pdev, &tpa_info->state, TPA_STATE_NONE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Update the ramrod IPVX according to the current and required
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * state.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param chain_idx
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param vbd_rsc_ipvx_bit - The VBD TPA ipvX bit.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return STATIC u8_t - The HSI IPVX eth_tpa_update_command
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_tpa_ramrod_update_ipvx(IN lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t chain_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t vbd_tpa_ipvx_bit)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Add ramrod send code
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const lm_tpa_info_t* tpa_info = &LM_TPA_INFO(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t ramrod_ipvx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(GET_FLAGS(tpa_info->ipvx_enabled_required, vbd_tpa_ipvx_bit) ==
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi GET_FLAGS(tpa_info->ipvx_enabled_current, vbd_tpa_ipvx_bit))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_ipvx = TPA_UPDATE_NONE_COMMAND;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if(GET_FLAGS(tpa_info->ipvx_enabled_required, vbd_tpa_ipvx_bit))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_ipvx = TPA_UPDATE_ENABLE_COMMAND;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_ipvx = TPA_UPDATE_DISABLE_COMMAND;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ramrod_ipvx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Fill and send TPA ramrod.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param chain_idx
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiSTATIC lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_tpa_send_ramrod(IN lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t chain_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Add ramrod send code
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const lm_tpa_chain_t* tpa_chain = &LM_TPA( pdev, chain_idx );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const lm_bd_chain_t* tpa_chain_bd = &LM_TPA_CHAIN_BD(pdev, chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if((CHK_NULL(tpa_chain->ramrod_data_virt)) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (lm_tpa_state_enable != tpa_chain->state)||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.rss_chain_cnt <= chain_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_tpa_send_ramrod : invalid paramters");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt->update_ipv4 = lm_tpa_ramrod_update_ipvx(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi chain_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi TPA_IPV4_ENABLED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt->update_ipv6 = lm_tpa_ramrod_update_ipvx(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi chain_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi TPA_IPV6_ENABLED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TPA mode to use (LRO or GRO) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt->tpa_mode = TPA_LRO;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt->client_id = LM_FW_CLI_ID(pdev, chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* maximal TPA queues allowed for this client */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt->max_tpa_queues = LM_TPA_MAX_AGGS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* The maximal number of SGEs that can be used for one packet. depends on MTU and SGE size. must be 0 if SGEs are disabled */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt->max_sges_for_packet = DIV_ROUND_UP_BITS(pdev->params.l2_cli_con_params[chain_idx].mtu, LM_TPA_PAGE_BITS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Avoiding rings thresholds verification is aimed for eVBD
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // which receives its buffers and SGEs only after client init
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // is completed.(eVBD receives the buffers and SGEs only after
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // client setup is completed.)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt->dont_verify_rings_pause_thr_flg = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Size of the buffers pointed by SGEs */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(LM_TPA_PAGE_SIZE < MAX_VARIABLE_VALUE(tpa_chain->ramrod_data_virt->sge_buff_size));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt->sge_buff_size = mm_cpu_to_le16(LM_TPA_PAGE_SIZE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* maximal size for the aggregated TPA packets, reprted by the host */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC((LM_TPA_MAX_AGG_SIZE * LM_TPA_PAGE_SIZE) < MAX_VARIABLE_VALUE(tpa_chain->ramrod_data_virt->max_agg_size));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt->max_agg_size = mm_cpu_to_le16(LM_TPA_MAX_AGG_SIZE * LM_TPA_PAGE_SIZE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //u32_t sge_page_base_lo /* The address to fetch the next sges from (low) */;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt->sge_page_base_lo = mm_cpu_to_le32(tpa_chain_bd->bd_chain_phy.as_u32.low);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //u32_t sge_page_base_hi /* The address to fetch the next sges from (high) */;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt->sge_page_base_hi = mm_cpu_to_le32(tpa_chain_bd->bd_chain_phy.as_u32.high);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //u16_t sge_pause_thr_low /* number of remaining sges under which, we send pause message */;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt->sge_pause_thr_low = mm_cpu_to_le16(LM_TPA_SGE_PAUSE_THR_LOW);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //u16_t sge_pause_thr_high /* number of remaining sges above which, we send un-pause message */;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt->sge_pause_thr_high = mm_cpu_to_le16(LM_TPA_SGE_PAUSE_THR_HIGH);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_post(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi chain_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_ETH_TPA_UPDATE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_MEDIUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ETH_CONNECTION_TYPE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(u64_t *)&(tpa_chain->ramrod_data_phys));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Run on all RSS chains and send the ramrod on each one.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param chain_idx_base
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_tpa_send_ramrods(IN lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t chain_idx_base)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tpa_info_t* tpa_info = &LM_TPA_INFO(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t chain_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t rss_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Number of ramrods expected in receive
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_info->ramrod_recv_cnt = pdev->params.rss_chain_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_info->state = TPA_STATE_RAMROD_SENT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_info->ramrod_recv_cnt++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_vf_pf_update_rsc(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status == LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_vf_pf_wait_no_messages_pending(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((lm_status == LM_STATUS_SUCCESS) && (0 == mm_atomic_dec((u32_t*)(&tpa_info->ramrod_recv_cnt))))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_info->ipvx_enabled_current = tpa_info->ipvx_enabled_required;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tpa_info->update_cookie)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void* cookie = (void *)tpa_info->update_cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_info->update_cookie = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_set_done(pdev, 0, cookie);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_FOREACH_RSS_IDX(pdev, rss_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi chain_idx = chain_idx_base + RSS_ID_TO_CID(rss_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_tpa_send_ramrod(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg(" Ramrod send failed ");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Fill and send function_update_data ramrod.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_encap_send_ramrod(IN lm_device_t *pdev, u8_t new_encap_offload_state, void* cookie)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_encap_info_t* encaps_info = &(pdev->encap_info);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct function_update_data* data = LM_SLOWPATH(pdev, encap_function_update_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const lm_address_t data_phys = LM_SLOWPATH_PHYS(pdev, encap_function_update_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // check that we are not in the middle of handling another encapsulated packets offload set request (1 pending)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(encaps_info->new_encap_offload_state != encaps_info->current_encap_offload_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(encaps_info->update_cookie);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi encaps_info->new_encap_offload_state = new_encap_offload_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (encaps_info->new_encap_offload_state == encaps_info->current_encap_offload_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEencap, "no change in encapsulated packets offload state\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // remember this for mm_set_done call (called on completion of the ramrod)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // mm_set_done will free memory of query_set_info
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi encaps_info->update_cookie = cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // GRE config for the function will be updated according to the gre_tunnel_rss and nvgre_clss_en fields
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->update_tunn_cfg_flg = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ENCAP_OFFLOAD_DISABLED == pdev->encap_info.new_encap_offload_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->tunn_clss_en = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->tunnel_mode = TUNN_MODE_NONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->tunn_clss_en = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->tunnel_mode = TUNN_MODE_GRE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->gre_tunnel_type = NVGRE_TUNNEL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->echo = FUNC_UPDATE_RAMROD_SOURCE_ENCAP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_sq_post(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0, //Don't care
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_NORMAL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NONE_CONNECTION_TYPE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data_phys.as_u64);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This function is a general eq ramrod fuanction that waits
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * synchroniously for it's completion.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * cmd_id -The ramrod command ID
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * data -ramrod data
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * curr_state - what to poll on
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * curr_state Current state.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * new_state - what we're waiting for.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t SUCCESS / TIMEOUT on waiting for
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_eq_ramrod_post_sync( IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u8_t cmd_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u64_t data,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u8_t ramrod_priority,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN volatile u32_t *p_curr_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t curr_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t new_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMeq|INFORMl2sp, "#lm_eq_ramrod\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *p_curr_state = curr_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_sq_post(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0, //Don't care
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cmd_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_priority,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NONE_CONNECTION_TYPE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_wait_state_change(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi p_curr_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi new_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_eq_ramrod_post_sync */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_halt_eth_con(struct _lm_device_t *pdev, u32_t cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t send_ramrod)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi union eth_specific_data ramrod_data = {{0}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t data_mapping = {{0}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t fw_client_idx = 0xFFFFFFFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t con_state = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi fw_client_idx = lm_get_fw_client_idx_from_cid(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(sizeof(ramrod_data) == sizeof(u64_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con_state = lm_get_con_state(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN/*INFORMi|INFORMl2sp*/, "#lm_halt_eth_con cid=%d fw_client_idx=%d client_info=%d(%d)\n",cid, fw_client_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,con_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ERR_IF(con_state != LM_CON_STATE_OPEN))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!DBG_BREAK_ON(UNDER_TEST));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(FALSE == send_ramrod)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, cid, LM_CON_STATE_HALT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl2sp, "lm_close_eth_con:The HALT ramrod isn't sent \n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Send ramrod
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, cid, LM_CON_STATE_HALT_SENT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_data.halt_ramrod_data.client_id = fw_client_idx; //LM_FW_CLI_ID(pdev, client_info_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* convert halt_ramrod_data to a big-endian friendly format */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data_mapping.as_u32.low = ramrod_data.halt_ramrod_data.client_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_sq_post(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_ETH_HALT,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_MEDIUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ETH_CONNECTION_TYPE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data_mapping.as_u64);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_eth_wait_state_change(pdev, LM_CON_STATE_HALT, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_halt_eth_con */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_terminate_eth_con(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t const cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_terminate_eth_con, cid=%d \n",cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ERR_IF(lm_get_con_state(pdev, cid) != LM_CON_STATE_HALT))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, cid, LM_CON_STATE_TERMINATE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS; /* Not supported for VFs */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_sq_post(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_ETH_TERMINATE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_MEDIUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ETH_CONNECTION_TYPE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_eth_wait_state_change(pdev, LM_CON_STATE_TERMINATE, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_cfc_del_eth_con(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t const cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* VIA PF!!!!!!*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_cfc_del_eth_con, cid=%d\n",cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ERR_IF(lm_get_con_state(pdev, cid) != LM_CON_STATE_TERMINATE))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_sq_post(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_COMMON_CFC_DEL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_MEDIUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NONE_CONNECTION_TYPE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_eth_wait_state_change(pdev, LM_CON_STATE_CLOSE, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_cfc_del_eth_con */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_establish_forward_con(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t const fwd_cid = FWD_CID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi | INFORMl2sp, "lm_establish_forward_con\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_establish_eth_con(pdev, fwd_cid, DEF_STATUS_BLOCK_INDEX , LM_CLIENT_ATTRIBUTES_TX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_establish_forward_con failed\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev,INFORMi | INFORMl2sp, "Establish forward connection ramrod completed\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_close_forward_con(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t const fwd_cid = FWD_CID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* halt and terminate ramrods (lm_{halt,terminate}_eth_con) are not sent for the forward channel connection.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi therefore we just change the state from OPEN to TERMINATE, and send the cfc del ramrod */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_get_con_state(pdev, fwd_cid) != LM_CON_STATE_OPEN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, fwd_cid, LM_CON_STATE_TERMINATE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_cfc_del_eth_con(pdev,fwd_cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev,INFORMi | INFORMl2sp, "lm_close_forward_con completed\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_close_eth_con(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t const cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t send_halt_ramrod)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t max_eth_cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_fl_reset_is_inprogress(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, cid, LM_CON_STATE_CLOSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_chip_stop: Under FLR: \"close\" cid=%d.\n", cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_CHANNEL_VFDEV(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_vf_queue_close(pdev, (u8_t)cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_halt_eth_con(pdev,cid, send_halt_ramrod);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_terminate_eth_con(pdev,cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_cfc_del_eth_con(pdev,cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (MM_DCB_MP_L2_IS_ENABLE(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi max_eth_cid = lm_mp_max_cos_chain_used(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi max_eth_cid = MAX_RX_CHAIN(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid < max_eth_cid) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_clear_eth_con_resc(pdev,(u8_t)cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev,INFORMi | INFORMl2sp, "lm_close_eth_con completed for cid=%d\n", cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_eth_wait_state_change(struct _lm_device_t *pdev, u32_t new_state, u32_t cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_cid_resc_t * cid_resc = lm_cid_resc(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHK_NULL(cid_resc))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_wait_state_change(pdev, &cid_resc->con_state, new_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_eth_wait_state_change */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_func_update_post_command Post a func_update ramrod and
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * wait for its completion.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Must be called from a work item.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev the device
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param command the ramrod cmd_id (NONE_CONNECTION_TYPE is
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * assumed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param data the ramrod data
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success, some other
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * failure code on failure.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_l2mp_func_update_command( IN lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const struct function_update_data *func_data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct function_update_data* data = LM_SLOWPATH(pdev, l2mp_func_update_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t data_phys = LM_SLOWPATH_PHYS(pdev, l2mp_func_update_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->slowpath_info.l2mp_func_update_ramrod_state != L2MP_FUNC_UPDATE_RAMROD_NOT_POSTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(data, func_data, sizeof(struct function_update_data));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->echo = FUNC_UPDATE_RAMROD_SOURCE_L2MP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_eq_ramrod_post_sync(pdev,RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE, data_phys.as_u64,CMD_PRIORITY_NORMAL,&pdev->slowpath_info.l2mp_func_update_ramrod_state, L2MP_FUNC_UPDATE_RAMROD_POSTED, L2MP_FUNC_UPDATE_RAMROD_COMPLETED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(LM_STATUS_SUCCESS != lm_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi goto _exit;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi_exit:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.l2mp_func_update_ramrod_state = L2MP_FUNC_UPDATE_RAMROD_NOT_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*********************** NIV **************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_niv_post_command(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t command,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u64_t data,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u32_t curr_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const niv_ramrod_state_t niv_ramrod_state = curr_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((NIV_RAMROD_COMPLETED == curr_state)||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (NIV_RAMROD_NOT_POSTED == curr_state));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->slowpath_info.niv_ramrod_state != NIV_RAMROD_NOT_POSTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_eq_ramrod_post_sync(pdev,command,data,CMD_PRIORITY_NORMAL,&pdev->slowpath_info.niv_ramrod_state, niv_ramrod_state, NIV_RAMROD_COMPLETED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(LM_STATUS_SUCCESS != lm_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi goto _exit;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi_exit:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.niv_ramrod_state = NIV_RAMROD_NOT_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_niv_vif_update(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u16_t vif_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u16_t default_vlan,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t allowed_priorities)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct function_update_data* data = LM_SLOWPATH(pdev, niv_function_update_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t data_phys = LM_SLOWPATH_PHYS(pdev, niv_function_update_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->vif_id_change_flg = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->vif_id = mm_cpu_to_le16(vif_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->afex_default_vlan_change_flg = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->afex_default_vlan = mm_cpu_to_le16(default_vlan);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->allowed_priorities_change_flg = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->allowed_priorities = allowed_priorities;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->network_cos_mode_change_flg = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->lb_mode_en = FALSE; //if a VIF update was received it means we're connected to a switch, so we're not in LB mode.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->lb_mode_en_change_flg = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data->echo = FUNC_UPDATE_RAMROD_SOURCE_NIV;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_niv_post_command(pdev,RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE, data_phys.as_u64, NIV_RAMROD_VIF_UPDATE_POSTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_niv_vif_list_update(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const enum vif_list_rule_kind command,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u16_t list_index,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t func_bit_map,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t func_to_clear)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct afex_vif_list_ramrod_data data = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data.func_bit_map = func_bit_map;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data.func_to_clear = func_to_clear;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data.afex_vif_list_command = command;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data.vif_list_index = list_index;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi data.echo = command;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_niv_post_command(pdev,RAMROD_CMD_ID_COMMON_AFEX_VIF_LISTS, *((u64_t*)(&data)), NIV_RAMROD_VIF_LISTS_POSTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/****************** CLASSIFICATION ********************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Set/Unset a mac-address or mac-vlan pair on a given chain.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param mac_addr - array of size ETHERNET_ADDRESS_SIZE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * containing a valid mac addresses
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param vlan_tag - vlan tag to be set with mac address
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param chain_idx - which chain to set the mac on. Chain_idx
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * will be transformed to a l2 client-id
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param cookie - will be returned to MM layer on completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param set - set or remove mac address
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param is_encap_inner_mac_filter - set if we filter according
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to inner mac (VMQ offload of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * encapsulated packets)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t SUCCESS on syncrounous success, PENDING
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * if completion will be called later, FAILURE o/w
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_set_mac_addr(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t *mac_addr,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t vlan_tag,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t chain_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void* cookie,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t b_set,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t is_encap_inner_mac_filter)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_ramrod_params ramrod_param = { 0 };
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = ECORE_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_cli_idx_t lm_cli_idx = LM_CLI_IDX_MAX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t cid = chain_idx; // FIXME!!!
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ERR_IF(!mac_addr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_set_mac_addr: invalid params\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_reset_is_inprogress(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_set_mac_addr: Under FLR!!!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_CHANNEL_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_vf_pf_set_q_filters(pdev, LM_CLI_IDX_NDIS, cookie, Q_FILTER_MAC, mac_addr, ETHERNET_ADDRESS_SIZE,vlan_tag, b_set);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN/*INFORMl2sp*/, "lm_set_mac_addr: b_set=%d chain_idx=%d!!!\n", b_set, chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp, "lm_set_mac_addr: [%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]!!!\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Prepare ramrod params to be sent to ecore layer... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vlan_tag != LM_SET_CAM_NO_VLAN_FILTER)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(CHIP_IS_E1(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC( ETHERNET_ADDRESS_SIZE == sizeof(ramrod_param.user_req.u.vlan_mac.mac) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy( ramrod_param.user_req.u.vlan_mac.mac, mac_addr, sizeof(ramrod_param.user_req.u.vlan_mac.mac));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.u.vlan_mac.vlan = vlan_tag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.u.vlan_mac.is_inner_mac = is_encap_inner_mac_filter;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.vlan_mac_obj = &pdev->client_info[chain_idx].mac_vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC( ETHERNET_ADDRESS_SIZE == sizeof(ramrod_param.user_req.u.mac.mac) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy( ramrod_param.user_req.u.mac.mac, mac_addr, sizeof(ramrod_param.user_req.u.mac.mac) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.u.mac.is_inner_mac = is_encap_inner_mac_filter;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.vlan_mac_obj = &pdev->client_info[chain_idx].mac_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Set the cookie BEFORE sending the ramrod!!!! ramrod may complete in the mean time... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->client_info[cid].set_mac_cookie != NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[cid].set_mac_cookie = cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.cmd = b_set ? ECORE_VLAN_MAC_ADD : ECORE_VLAN_MAC_DEL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_cli_idx = LM_CHAIN_IDX_CLI(pdev, chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_BIT( ramrod_param.ramrod_flags, RAMROD_EXEC );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (lm_cli_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_CLI_IDX_NDIS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_BIT (ramrod_param.user_req.vlan_mac_flags, ECORE_ETH_MAC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_CLI_IDX_ISCSI:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_BIT (ramrod_param.user_req.vlan_mac_flags, ECORE_ISCSI_ETH_MAC);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Nothing... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = ecore_config_vlan_mac(pdev, &ramrod_param );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_STATUS_PENDING != lm_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[cid].set_mac_cookie = NULL; // rollback
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Set/Unset a vlan on a given chain.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Setting/unsetting a vlan is a bit more complex than
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * setting a mac address and is therefore implemented in a
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * separate function. It require deleting a previous vlan
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * tag if one was set, and changing rx-filtering rules. The
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * change in rx-filtering rules has to do with "any-vlan".
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * If no vlan is set we want "any-vlan" otherwise we want
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to remove the any-vlan, this requires another ramrod.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The way this is implemented is as follows:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * 1. prepare vlan add/remove commands without
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * executing them (sp-verbs feature don't send EXEC)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * 2. If need to set rx-mask, turn on a flag that will
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * be checked on completion of rx-mask, in
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * lm_eq_handle_rx_filter.., we look at this flag and
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * if it's on execute the vlan pending command
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * (sp-verbs CONT feature).
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param vlan_tag - vlan tag to be set
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param chain_idx - which chain to set the vlan on. Chain_idx
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * will be transformed to a l2 client-id
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param cookie - will be returned to MM layer on completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param set - set or remove vlan
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t SUCCESS on syncrounous success, PENDING
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * if completion will be called later, FAILURE o/w
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_set_vlan_only(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t vlan_tag,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t chain_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void* cookie,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t b_set )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_ramrod_params ramrod_param = { 0 };
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = ECORE_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_cli_idx_t lm_cli_idx = LM_CLI_IDX_MAX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t cid = chain_idx; // FIXME!!!
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t b_set_rx_mask = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_reset_is_inprogress(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_set_mac_addr: Under FLR!!!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_CHANNEL_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* 9/22/11 Michals: should we support this for VFs??? */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp, "lm_set_vlan_only: b_set=%d chain_idx=%d!!!\n", b_set, chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Prepare ramrod params to be sent to ecore layer... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_IS_E1x(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN/*INFORMl2sp*/, "lm_set_vlan_only: not supported for E1x!!!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.vlan_mac_obj = &pdev->client_info[chain_idx].vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->client_info[chain_idx].current_set_vlan == vlan_tag)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_EXISTING_OBJECT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Set the cookie BEFORE sending the ramrod!!!! ramrod may complete in the mean time... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->client_info[cid].set_mac_cookie != NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[cid].set_mac_cookie = cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (b_set)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If we're just setting vlan, check if we need to delete the old one first... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->client_info[chain_idx].current_set_vlan != 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.u.vlan.vlan = pdev->client_info[chain_idx].current_set_vlan;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.cmd = ECORE_VLAN_MAC_DEL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = ecore_config_vlan_mac(pdev, &ramrod_param );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* don't really care about the status... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Prepare for the setting... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.u.vlan.vlan = vlan_tag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.u.vlan.vlan = pdev->client_info[chain_idx].current_set_vlan;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[chain_idx].current_set_vlan = vlan_tag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.cmd = b_set ? ECORE_VLAN_MAC_ADD : ECORE_VLAN_MAC_DEL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_cli_idx = LM_CHAIN_IDX_CLI(pdev, chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Determine if rx-mask needs to be changed as a result of this update. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi b_set_rx_mask = (( b_set && pdev->client_info[cid].b_any_vlan_on) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (!b_set && !pdev->client_info[cid].b_any_vlan_on) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If we don't need to change the mask we need to execute commands now, otherwise they'll
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi be executed from rx filter completion */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!b_set_rx_mask )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_BIT( ramrod_param.ramrod_flags, RAMROD_EXEC );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = ecore_config_vlan_mac(pdev, &ramrod_param );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( (LM_STATUS_PENDING != lm_status) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[cid].set_mac_cookie = NULL; /* rollback */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* see function description to understand this better... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (b_set_rx_mask)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[chain_idx].b_vlan_only_in_process = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_set_rx_mask(pdev, cid, pdev->client_info[cid].last_set_rx_mask, NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Move a filter from one chain idx to another atomically
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param mac_addr - array of size ETHERNET_ADDRESS_SIZE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * containing a valid mac addresses
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param vlan_tag - vlan tag to be set with mac address
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param src_chain_idx - which chain to remove the mac from
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param dest_chain_idx - which chain to set the mac on
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param cookie - will be returned to MM layer on completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_move_mac_addr(struct _lm_device_t *pdev, u8_t *mac_addr, u16_t vlan_tag,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t src_chain_idx, u8_t dest_chain_idx, void * cookie, u8_t is_encap_inner_mac_filter)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_ramrod_params ramrod_param = { 0 };
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_obj *dest_obj = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = ECORE_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t sw_client_id = src_chain_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ERR_IF(!pdev || !mac_addr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_move_mac_addr: invalid params\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_reset_is_inprogress(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_move_mac_addr: Under FLR!!!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_CHANNEL_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_move_mac_addr: Move not expected on VF\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp, "lm_move_mac_addr: src_chain_idx=%d dest_chain_idx=%d!!!\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi src_chain_idx, dest_chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp, "lm_move_mac_addr: [%d]:[%d]:[%d]:[%d]:[%d]:[%d] set=%d chain_idx=%d!!!\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5], mac_addr[6]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Prepare ramrod params to be sent to ecore layer... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vlan_tag != LM_SET_CAM_NO_VLAN_FILTER)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy( ramrod_param.user_req.u.vlan_mac.mac, mac_addr, sizeof(ramrod_param.user_req.u.vlan_mac.mac));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.u.vlan_mac.vlan = vlan_tag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.u.vlan_mac.is_inner_mac = is_encap_inner_mac_filter;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.vlan_mac_obj = &pdev->client_info[src_chain_idx].mac_vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dest_obj = &pdev->client_info[dest_chain_idx].mac_vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy( ramrod_param.user_req.u.mac.mac, mac_addr, sizeof(ramrod_param.user_req.u.mac.mac) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.u.mac.is_inner_mac = is_encap_inner_mac_filter;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.vlan_mac_obj = &pdev->client_info[src_chain_idx].mac_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dest_obj = &pdev->client_info[dest_chain_idx].mac_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Set the cookie BEFORE sending the ramrod!!!! ramrod may complete in the mean time... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->client_info[sw_client_id].set_mac_cookie != NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[sw_client_id].set_mac_cookie = cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.cmd = ECORE_VLAN_MAC_MOVE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.user_req.target_obj = dest_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_BIT( ramrod_param.ramrod_flags, RAMROD_EXEC );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = ecore_config_vlan_mac(pdev, &ramrod_param );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( LM_STATUS_PENDING == lm_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* FIXME: VF MACS in NIG stay??*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[sw_client_id].set_mac_cookie = NULL; // rollback
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Waits for the last set-mac called to complete, could be
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * set-mac or set-mac-vlan...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param chain_idx - the same chain-idx that the set-mac was
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * called on
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t SUCCESS or TIMEOUT
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_wait_set_mac_done(struct _lm_device_t *pdev, u8_t chain_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_obj *mac_obj = &pdev->client_info[chain_idx].mac_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_obj *mac_vlan_obj = &pdev->client_info[chain_idx].mac_vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = mac_obj->wait(pdev, mac_obj);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CHIP_IS_E1(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = mac_vlan_obj->wait(pdev, mac_vlan_obj);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Waits for the last set-vlan called to complete
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param chain_idx - the same chain-idx that the set-vlan was
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * called on
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t SUCCESS or TIMEOUT
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_wait_set_vlan_done(struct _lm_device_t *pdev, u8_t chain_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_obj *vlan_obj = &pdev->client_info[chain_idx].vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CHIP_IS_E1x(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = vlan_obj->wait(pdev, vlan_obj);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Clears all the mac address that are set on a certain cid...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param chain_idx - which chain_idx to clear macs on...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @assumptions: Called in PASSIVE_LEVEL!! function sleeps...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_clear_all_mac_addr(struct _lm_device_t *pdev, const u8_t chain_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define THE_REST_OF_ETH_MAC 0xffff
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_ramrod_params ramrod_params = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_obj * vlan_mac_obj = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = ECORE_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mac_types[] = {ECORE_ETH_MAC, ECORE_ISCSI_ETH_MAC, THE_REST_OF_ETH_MAC};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_obj * vlan_mac_objs[2] = {NULL, NULL};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t obj_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp, "lm_clear_all_mac_addr chain_idx=%d\n", chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vlan_mac_objs[0] = &pdev->client_info[chain_idx].mac_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vlan_mac_objs[1] = &pdev->client_info[chain_idx].mac_vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (obj_idx = 0; obj_idx < ARRSIZE(vlan_mac_objs); obj_idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vlan_mac_obj = vlan_mac_objs[obj_idx];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_params.vlan_mac_obj = vlan_mac_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* mac_vlan_obj only relevant for chips that are not E1... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((vlan_mac_obj == &pdev->client_info[chain_idx].mac_vlan_obj) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CHIP_IS_E1(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < ARRSIZE(mac_types); idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_BIT( ramrod_params.ramrod_flags, RAMROD_COMP_WAIT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_params.user_req.vlan_mac_flags = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (mac_types[idx] != THE_REST_OF_ETH_MAC)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_BIT( ramrod_params.user_req.vlan_mac_flags, mac_types[idx]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = vlan_mac_obj->delete_all( pdev, ramrod_params.vlan_mac_obj, &ramrod_params.user_req.vlan_mac_flags, &ramrod_params.ramrod_flags );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Restores all the mac address that are set on a certain
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * cid (after sleep / hibernate...)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param chain_idx - which chain_idx to clear macs on...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @assumptions: Called in PASSIVE_LEVEL!! function sleeps...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_restore_all_mac_addr(struct _lm_device_t *pdev, u8_t chain_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_ramrod_params ramrod_params = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_obj * vlan_mac_obj = &pdev->client_info[chain_idx].mac_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = ECORE_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_registry_elem* pos = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp, "lm_clear_all_mac_addr chain_idx=%d\n", chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_params.vlan_mac_obj = vlan_mac_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT(RAMROD_COMP_WAIT, &ramrod_params.ramrod_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = vlan_mac_obj->restore(pdev, &ramrod_params, &pos);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (pos != NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Take care of the pairs and vlans as well... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CHIP_IS_E1(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vlan_mac_obj = &pdev->client_info[chain_idx].mac_vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_params.vlan_mac_obj = vlan_mac_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT(RAMROD_COMP_WAIT, &ramrod_params.ramrod_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pos = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = vlan_mac_obj->restore(pdev, &ramrod_params, &pos);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } while (pos != NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CHIP_IS_E1x(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vlan_mac_obj = &pdev->client_info[chain_idx].vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_params.vlan_mac_obj = vlan_mac_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT(RAMROD_COMP_WAIT, &ramrod_params.ramrod_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pos = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = vlan_mac_obj->restore(pdev, &ramrod_params, &pos);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } while (pos != NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/************************ RX FILTERING ***************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - set/unset rx filtering for a client. The setting is done
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * for RX + TX, since tx switching is enabled FW needs to
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * know the configuration for tx filtering as well. The
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * configuration is almost semmetric for rx / tx except for
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the case of promiscuous in which case rx is in
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * accept_unmatched and Tx is in accept_all (meaning all
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * traffic is sent to loopback channel)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Assumptions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - An inter client lock is taken by the caller
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Return
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - Success / Pending or Failure
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_set_rx_mask(lm_device_t *pdev, u8_t chain_idx, lm_rx_mask_t rx_mask, void * cookie)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_rx_mode_ramrod_params ramrod_param = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_cli_idx_t lm_cli_idx = LM_CLI_IDX_MAX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi unsigned long rx_accept_flags = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi unsigned long tx_accept_flags = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = ECORE_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp, "lm_set_rx_mask chain_idx=%d rx_mask=%d\n", chain_idx, rx_mask);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_reset_is_inprogress(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_set_rx_mask: Under FLR!!!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_CHANNEL_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_vf_pf_set_q_filters(pdev, chain_idx, FALSE, Q_FILTER_RX_MASK, (u8_t*)&rx_mask, sizeof(lm_rx_mask_t), LM_SET_CAM_NO_VLAN_FILTER, FALSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pdev->client_info[chain_idx].b_vlan_only_in_process &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[chain_idx].last_set_rx_mask == rx_mask)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* No need to send a filter that has already been set...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return immediately */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp, "lm_set_rx_mask returning immediately: mask didn't change!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* initialize accept flags in ECORE language */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->client_info[chain_idx].current_set_vlan == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_ANY_VLAN, &rx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_ANY_VLAN, &tx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[chain_idx].b_any_vlan_on = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[chain_idx].b_any_vlan_on = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* find the desired filtering configuration */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if GET_FLAGS(rx_mask ,LM_RX_MASK_PROMISCUOUS_MODE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_UNICAST, &rx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_UNMATCHED, &rx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_ALL_MULTICAST, &rx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_BROADCAST, &rx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_UNICAST, &tx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_ALL_MULTICAST, &tx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_BROADCAST, &tx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* In NPAR + vm_switch_enable mode, we need to turn on the ACCEPT_ALL_UNICAST for TX to make
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * sure all traffic passes on the loopback channel to enable non-enlighted vms to communicate (vms that we don't
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * have their MAC set) .
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * We turn it on once we're in promiscuous, which signals that there is probablly vms up that need
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * this feature. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_MF_SI_MODE(pdev) && pdev->params.npar_vm_switching_enable)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_ALL_UNICAST, &tx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if GET_FLAGS(rx_mask ,LM_RX_MASK_ACCEPT_UNICAST)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* accept matched ucast */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_UNICAST, &rx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_UNICAST, &tx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if GET_FLAGS(rx_mask ,LM_RX_MASK_ACCEPT_MULTICAST)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* accept matched mcast */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_MULTICAST, &rx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_MULTICAST, &tx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if GET_FLAGS(rx_mask ,LM_RX_MASK_ACCEPT_ALL_MULTICAST)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* accept all mcast */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_ALL_MULTICAST, &rx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_ALL_MULTICAST, &tx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if GET_FLAGS(rx_mask ,LM_RX_MASK_ACCEPT_BROADCAST)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* accept matched bcast */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_BROADCAST, &rx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT_NA(ECORE_ACCEPT_BROADCAST, &tx_accept_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if GET_FLAGS(rx_mask ,LM_RX_MASK_ACCEPT_ERROR_PACKET)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TBD: there is no usage in Miniport for this flag */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Prepare ramrod parameters */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.cid = chain_idx; // echo..
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.cl_id = LM_FW_CLI_ID(pdev, chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.rx_mode_obj = &pdev->slowpath_info.rx_mode_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.func_id = FUNC_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.pstate = (unsigned long *)&pdev->client_info[chain_idx].sp_rxmode_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.state = ECORE_FILTER_RX_MODE_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // We set in lm_cli_idx always 0 (LM_CLI_IDX_NDIS) for E1x and lm_cli_idx for e2.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // LM_CLI_IDX_NDIS is an occasional choice and could be any of the LM_CLI_IDX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // * rx_mode_rdata PER INDEX is problematic because:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // the rx filtering is same place in internal ram of e1.5/e1.0 and when we work with an array
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // each client run over the bits of the previous client
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // * rx_mode_rdata NOT PER INDEX is problematic because:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // in e2.0 when we send a ramrod, the rdata is same memory for all
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // clients and therefore in case of parallel run of rx_mask of clients
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // one of the ramrods actually won't be sent with the correct data
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // * Conclusion: we have here a problem which make a conflict that both E1.0/E1.5 and E2 work without issues.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // This issue should be resolved in a proper way which should be discussed.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // This note is related to the following two CQ's:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // CQ53609 - eVBD:57712: evbda!lm_sq_complete+7ca; Assert is seen while running ACPI S1 S3 sleep stress test
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // CQ53444 - OIS Certs: iSCSI Ping Test Fails
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_cli_idx = CHIP_IS_E1x(pdev) ? LM_CLI_IDX_NDIS : LM_CHAIN_IDX_CLI(pdev, chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_CLI_IDX_MAX <= lm_cli_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg(" lm_cli_idx has an invalid value");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.rdata = LM_SLOWPATH(pdev, rx_mode_rdata)[lm_cli_idx];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.rdata_mapping = LM_SLOWPATH_PHYS(pdev, rx_mode_rdata)[lm_cli_idx];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT(ECORE_FILTER_RX_MODE_PENDING, &pdev->client_info[chain_idx].sp_rxmode_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT(RAMROD_RX, &ramrod_param.ramrod_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT(RAMROD_TX, &ramrod_param.ramrod_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.rx_mode_flags = 0; // FIXME ...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.rx_accept_flags = rx_accept_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ramrod_param.tx_accept_flags = tx_accept_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Must be set before the ramrod... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->client_info[chain_idx].set_rx_mode_cookie != NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[chain_idx].last_set_rx_mask = rx_mask;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[chain_idx].set_rx_mode_cookie = cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = ecore_config_rx_mode(pdev, &ramrod_param);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp, "Status returned from ecore_config_rx_mode: %d\n", lm_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status == LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[chain_idx].set_rx_mode_cookie = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (lm_status == LM_STATUS_REQUEST_NOT_ACCEPTED)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Sq is blocked... meaning we're in error recovery, this is our one outstanding oid.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * mark ecore as done, return PENDING to UM, don't clear cookie. This means miniport
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * will eventually get a completion as part of the re-initialization of the chip... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_CLEAR_BIT(ECORE_FILTER_RX_MODE_PENDING, &pdev->client_info[chain_idx].sp_rxmode_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_set_rx_mask */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Waits for the set=-rx-mode to complete*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_wait_set_rx_mask_done(struct _lm_device_t *pdev, u8_t chain_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_rx_mode_ramrod_params params = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi params.pstate = (unsigned long *)&pdev->client_info[chain_idx].sp_rxmode_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi params.state = ECORE_FILTER_RX_MODE_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = pdev->slowpath_info.rx_mode_obj.wait_comp(pdev, &params);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/************************* MULTICAST *****************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE lm_status_t _init_mcast_macs_list(lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t* mc_addrs,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t buf_len,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_mcast_ramrod_params *p)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8 mc_count = buf_len / ETHERNET_ADDRESS_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_mcast_list_elem *mc_mac = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mc_mac = mm_rt_alloc_mem(pdev, sizeof(*mc_mac) * mc_count, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!mc_addrs) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_clear(&p->mcast_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while(buf_len && mc_addrs)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mc_mac->mac = mc_addrs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp, "mc_addrs[%d]:mc_addrs[%d]:mc_addrs[%d]:mc_addrs[%d]:mc_addrs[%d]:mc_addrs[%d]\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mc_addrs[0],mc_addrs[1],mc_addrs[2],mc_addrs[3],mc_addrs[4],mc_addrs[5]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_tail(&p->mcast_list, &mc_mac->link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* move on to next mc addr */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi buf_len -= ETHERNET_ADDRESS_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mc_addrs += ETHERNET_ADDRESS_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mc_mac++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi p->mcast_list_len = mc_count;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void __free_mcast_macs_list(lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_mcast_ramrod_params *p)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_mcast_list_elem *mc_mac = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mc_mac = (struct ecore_mcast_list_elem *)d_list_peek_head(&p->mcast_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (mc_mac)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* note that p->mcast_list_len is now set to 0 after processing */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_rt_free_mem(pdev, mc_mac, sizeof(*mc_mac) * d_list_entry_cnt(&p->mcast_list), 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Function configures a list of multicast addresses. Or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * resets the list previously configured
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param mc_addrs - array of multicast addresses. NULL if unset is required
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param buf_len - length of the buffer - 0 if unset is required
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param cookie - will be returned on completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param lm_cli_idx - which lm client to send request on
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t - SUCCESS on syncrounous completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * PENDING on asyncounous completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * FAILURE o/w
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_set_mc(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t* mc_addrs, /* may be NULL (for unset) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t buf_len, /* may be 0 (for unset) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * cookie, lm_cli_idx_t lm_cli_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_mcast_ramrod_params rparam = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = ECORE_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_CHANNEL_VFDEV(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_vf_pf_set_q_filters(pdev, lm_cli_idx, cookie, Q_FILTER_MC, mc_addrs, buf_len, LM_SET_CAM_NO_VLAN_FILTER, FALSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(0 == LM_MC_TABLE_SIZE(pdev,lm_cli_idx))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("size must be greater than zero for a valid client\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Initialize params sent to ecore layer */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Need to split to groups of 16 for E2... due to hsi restraint*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (mc_addrs)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _init_mcast_macs_list(pdev, mc_addrs, buf_len, &rparam);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rparam.mcast_obj = &pdev->slowpath_info.mcast_obj[lm_cli_idx];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Cookie must be set before sending the ramord, since completion could arrive before
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * we return and the cookie must be in place*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->slowpath_info.set_mcast_cookie[lm_cli_idx] != NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.set_mcast_cookie[lm_cli_idx] = cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = ecore_config_mcast(pdev, &rparam, (mc_addrs != NULL)? ECORE_MCAST_CMD_ADD : ECORE_MCAST_CMD_DEL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status == LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.set_mcast_cookie[lm_cli_idx] = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (mc_addrs)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi __free_mcast_macs_list(pdev, &rparam);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_set_mc */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_set_mc_list(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_t * mc_addrs, /* may be NULL (for unset) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * cookie,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_cli_idx_t lm_cli_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_mcast_ramrod_params rparam = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = ECORE_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_CHANNEL_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_vf_pf_set_q_filters_list(pdev, lm_cli_idx, cookie,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Q_FILTER_MC, mc_addrs,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SET_CAM_NO_VLAN_FILTER, FALSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rparam.mcast_list = *mc_addrs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rparam.mcast_list_len = d_list_entry_cnt(mc_addrs);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rparam.mcast_obj = &pdev->slowpath_info.mcast_obj[lm_cli_idx];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Cookie must be set before sending the ramord, since completion could arrive before
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * we return and the cookie must be in place*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->slowpath_info.set_mcast_cookie[lm_cli_idx] != NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.set_mcast_cookie[lm_cli_idx] = cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = ecore_config_mcast(pdev, &rparam,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (mc_addrs != NULL) ? ECORE_MCAST_CMD_ADD :
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_MCAST_CMD_DEL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status == LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.set_mcast_cookie[lm_cli_idx] = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This routine is called to wait for the multicast set
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * completion. It must be called in passive level since it
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * may sleep
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param lm_cli_idx the cli-idx that the multicast was sent on.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status SUCCESS on done, TIMEOUT o/w
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_wait_set_mc_done(struct _lm_device_t *pdev, lm_cli_idx_t lm_cli_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_mcast_obj * mcast_obj = &pdev->slowpath_info.mcast_obj[lm_cli_idx];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = mcast_obj->wait_comp(pdev, mcast_obj);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/************************* RSS ***********************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Description: update RSS key in slowpath
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - given key_size is promised to be either 40 or 16 (promised by NDIS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Return:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description: Update RSS key in driver rss_hash_key array and
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * check if it has changed from previous key.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param hash_key - hash_key received from NDIS
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param key_size
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return u8_t TRUE if changed, FALSE o/w
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic u8_t lm_update_rss_key(struct _lm_device_t *pdev, u8_t *hash_key,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t key_size)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t val = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s32_t rss_reg = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t key_changed = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check params */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ERR_IF(!(pdev && hash_key))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Note: MSB (that is hash_key[0]) should be placed in MSB of register KEYRSS9, regardless the key size */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* GilR 4/4/2007 - assert on key_size==16/40? */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (rss_reg = 9, i = 0; rss_reg >= 0; rss_reg--)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi val = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (i < key_size)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi val = ((hash_key[i] << 24) | (hash_key[i+1] << 16) | (hash_key[i+2] << 8) | hash_key[i+3]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "KEYRSS[%d:%d]=0x%x, written to RSS_REG=%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i, i+3, val, rss_reg);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i += 4;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "OUT OF KEY size, writing 0x%x to RSS_REG=%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi val, rss_reg);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->slowpath_info.rss_hash_key[rss_reg] != val)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { /* key changed */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.rss_hash_key[rss_reg] = val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi key_changed = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (key_changed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl2, "update rss: KEY CHANGED\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return key_changed;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Enable RSS for Eth with given indirection table also updates the rss key
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * in searcher (for previous chips...- done by sp-verbs)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Assumptions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - given table_size is promised to be power of 2 (promised by NDIS),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * or 1 in case of RSS disabling
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - the indices in the given chain_indirection_table are chain
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * indices converted by UM layer...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * - given key_size is promised to be either 40 or 16 (promised by NDIS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param chain_indirection_table - array of size @table_size containing chain numbers
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param table_size - size of @indirection_table
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param hash_key - new hash_key to be configured. 0 means no key
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param key_size
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param hash_type
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param sync_with_toe - This field indicates that the completion to the mm layer
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * should take into account the fact that toe rss update will
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * be sent as well. A counter will be increased in lm for this purpose
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param cookie - will be returned on completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t - SUCCESS on syncrounous completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * PENDING on asyncounous completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * FAILURE o/w
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_enable_rss(struct _lm_device_t *pdev, u8_t *chain_indirection_table,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t table_size, u8_t *hash_key, u32_t key_size, lm_rss_hash_t hash_type,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8 sync_with_toe, void * cookie)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_config_rss_params params = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = ECORE_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t value = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t reconfigure = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t key_changed = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check params */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ERR_IF(!(pdev && chain_indirection_table))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (hash_type &
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ~(LM_RSS_HASH_IPV4 | LM_RSS_HASH_TCP_IPV4 | LM_RSS_HASH_IPV6 | LM_RSS_HASH_TCP_IPV6))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi params.rss_obj = &pdev->slowpath_info.rss_conf_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* RSS mode */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Fixme --> anything else ?*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT(ECORE_RSS_MODE_REGULAR, &params.rss_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Translate the hash type to "ecore" */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (GET_FLAGS(hash_type, LM_RSS_HASH_IPV4))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT(ECORE_RSS_IPV4, &params.rss_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (GET_FLAGS(hash_type, LM_RSS_HASH_TCP_IPV4))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT(ECORE_RSS_IPV4_TCP, &params.rss_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (GET_FLAGS(hash_type, LM_RSS_HASH_IPV6))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT(ECORE_RSS_IPV6, &params.rss_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (GET_FLAGS(hash_type, LM_RSS_HASH_TCP_IPV6))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT(ECORE_RSS_IPV6_TCP, &params.rss_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->slowpath_info.last_set_rss_flags != params.rss_flags)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.last_set_rss_flags = params.rss_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi reconfigure = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* set rss result mask according to table size
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (table_size is promised to be power of 2) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi params.rss_result_mask = (u8_t)table_size - 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->slowpath_info.last_set_rss_result_mask != params.rss_result_mask)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Hash bits */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.last_set_rss_result_mask = params.rss_result_mask;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi reconfigure = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < table_size; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = LM_CHAIN_TO_FW_CLIENT(pdev,chain_indirection_table[i]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->slowpath_info.last_set_indirection_table[i] != value)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp, "RssIndTable[%02d]=0x%x (Changed from 0x%x)\n", i, value, pdev->slowpath_info.last_set_indirection_table[i]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.last_set_indirection_table[i] = value;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi reconfigure = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(params.ind_table, pdev->slowpath_info.last_set_indirection_table, sizeof(params.ind_table));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (hash_key)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi key_changed = lm_update_rss_key(pdev, hash_key, key_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (key_changed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi reconfigure = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(params.rss_key, pdev->slowpath_info.rss_hash_key, sizeof(params.rss_key));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT(ECORE_RSS_SET_SRCH, &params.rss_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!reconfigure && sync_with_toe);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Not expected, that toe will update and ETH not, but just to make sure, if sync_with_toe
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * is true it means toe reconfigured... so eth must to to take care of sync... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (reconfigure || sync_with_toe)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If we're not syncing with toe, it means that these counters have not
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * been increased by toe, and need to be increased here. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!sync_with_toe)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->params.update_comp_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_inc(&pdev->params.update_comp_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_inc(&pdev->params.update_suspend_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->slowpath_info.set_rss_cookie);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.set_rss_cookie = cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_CHANNEL_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_vf_pf_update_rss(pdev, NULL, params.rss_flags, params.rss_result_mask, params.ind_table, params.rss_key);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status == LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_vf_pf_wait_no_messages_pending(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_dec(&pdev->params.update_comp_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_dec(&pdev->params.update_suspend_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = ecore_config_rss(pdev, &params);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
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/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This routine disables rss functionality by sending a
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * ramrod to FW.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param cookie - will be returned on completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param sync_with_toe - true means this call is synced with
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * toe, and completion will be called only
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * when both toe + eth complete. Eth needs
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to know this (reason in code) *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t - SUCCESS on syncrounous completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * PENDING on asyncounous completion
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * FAILURE o/w
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_disable_rss(struct _lm_device_t *pdev, u8_t sync_with_toe, void * cookie)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_config_rss_params params = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = ECORE_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t value = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp, "lm_disable_rss sync_with_toe = %d\n", sync_with_toe);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->slowpath_info.set_rss_cookie);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.set_rss_cookie = cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi params.rss_obj = &pdev->slowpath_info.rss_conf_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* RSS mode */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_SET_BIT(ECORE_RSS_MODE_DISABLED, &params.rss_flags);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.last_set_rss_flags = params.rss_flags;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If we're not syncing with toe, it means that these counters have not
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * been increased by toe, and need to be increased here. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!sync_with_toe)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_inc(&pdev->params.update_comp_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_inc(&pdev->params.update_suspend_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = LM_CHAIN_TO_FW_CLIENT(pdev,LM_SW_LEADING_RSS_CID(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < ARRSIZE(params.ind_table); i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.last_set_indirection_table[i] = value;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi params.ind_table[i] = value;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_CHANNEL_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_vf_pf_update_rss(pdev, NULL, params.rss_flags, params.rss_result_mask, params.ind_table, params.rss_key);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status == LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_vf_pf_wait_no_messages_pending(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_dec(&pdev->params.update_comp_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_dec(&pdev->params.update_suspend_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = ecore_config_rss(pdev, &params);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status == LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_disable_rss */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Wait for the rss disable/enable configuration to
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * complete
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t lm_status_t SUCCESS or TIMEOUT
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_wait_config_rss_done(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_raw_obj *raw = &pdev->slowpath_info.rss_conf_obj.raw;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = raw->wait_comp(pdev, raw);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_wait_vf_config_rss_done(struct _lm_device_t *pdev, lm_vf_info_t *vf_info)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_raw_obj *raw = &vf_info->vf_slowpath_info.rss_conf_obj.raw;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = raw->wait_comp(pdev, raw);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/************************** EQ HANDLING *******************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void lm_eq_handle_function_start_eqe(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->eq_info.function_state = FUNCTION_START_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_CMD_ID_COMMON_FUNCTION_START,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NONE_CONNECTION_TYPE, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void lm_eq_handle_function_stop_eqe(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->eq_info.function_state = FUNCTION_STOP_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_CMD_ID_COMMON_FUNCTION_STOP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NONE_CONNECTION_TYPE, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void lm_eq_handle_cfc_del_eqe(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cid = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t error = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid = mm_le32_to_cpu(elem->message.data.cfc_del_event.cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid = SW_CID(cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi error = elem->message.error;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid < pdev->context_info->proto_start[TOE_CONNECTION_TYPE]) //(MAX_ETH_CONS + MAX_VF_ETH_CONS))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { /* cfc del completion for eth cid */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_get_con_state(pdev, cid) != LM_CON_STATE_TERMINATE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, cid, LM_CON_STATE_CLOSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNeq, "lm_service_eq_intr: EVENT_RING_OPCODE_CFC_DEL_WB - calling lm_extract_ramrod_req!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { /* cfc del completion for toe cid */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (error) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_map_cid_to_proto(pdev, cid) != TOE_CONNECTION_TYPE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "ERROR completion is not valid for cid=0x%x\n",cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfAll(1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->toe_info.stats.total_cfc_delete_error++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->context_info->array[cid].cfc_delete_cnt++ < LM_MAX_VALID_CFC_DELETIONS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl4sp, "lm_eth_comp_cb: RAMROD_CMD_ID_ETH_CFC_DEL(0x%x) - %d resending!\n", cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->context_info->array[cid].cfc_delete_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_command_post(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_COMMON_CFC_DEL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_NORMAL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NONE_CONNECTION_TYPE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0 );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "A number of CFC deletions exceeded valid number of attempts\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfAll(1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_recycle_cid(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (elem->message.opcode == EVENT_RING_OPCODE_CFC_DEL)? RAMROD_CMD_ID_COMMON_CFC_DEL : RAMROD_CMD_ID_COMMON_CFC_DEL_WB,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NONE_CONNECTION_TYPE, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void lm_eq_handle_fwd_setup_eqe(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_get_con_state(pdev, FWD_CID(pdev)) != LM_CON_STATE_OPEN_SENT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, FWD_CID(pdev), LM_CON_STATE_OPEN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl2sp, "comp of FWD SETUP -calling lm_extract_ramrod_req!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_CMD_ID_ETH_FORWARD_SETUP,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ETH_CONNECTION_TYPE, FWD_CID(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void lm_eq_handle_mcast_eqe(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_mcast_ramrod_params rparam = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * cookie = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = ECORE_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cid = mm_le32_to_cpu(elem->message.data.eth_event.echo) & ECORE_SWCID_MASK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t lm_cli_idx = LM_CHAIN_IDX_CLI(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_mcast_obj * obj = &pdev->slowpath_info.mcast_obj[lm_cli_idx];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t indicate_done = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_CLI_IDX_MAX <= lm_cli_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg(" lm_eq_handle_mcast_eqe lm_cli_idx is invalid ");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Clear pending state for the last command */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi obj->raw.clear_pending(&obj->raw);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rparam.mcast_obj = obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If there are pending mcast commands - send them */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (obj->check_pending(obj))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = ecore_config_mcast(pdev, &rparam, ECORE_MCAST_CMD_CONT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_ecore_status_to_lm_status(ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status == LM_STATUS_PENDING)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi indicate_done = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "Failed to send pending mcast commands: %d\n", lm_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("Unexpected pending mcast command failed\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (indicate_done)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->slowpath_info.set_mcast_cookie[lm_cli_idx])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cookie = (void *)pdev->slowpath_info.set_mcast_cookie[lm_cli_idx];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.set_mcast_cookie[lm_cli_idx] = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_set_done(pdev, cid, cookie);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_IS_E1(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_CMD_ID_ETH_SET_MAC,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ETH_CONNECTION_TYPE, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_CMD_ID_ETH_MULTICAST_RULES,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ETH_CONNECTION_TYPE, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void lm_eq_handle_classification_eqe(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_raw_obj *raw = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void *cookie = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cid = GET_FLAGS( mm_le32_to_cpu(elem->message.data.eth_event.echo), ECORE_SWCID_MASK );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t type = mm_le32_to_cpu(elem->message.data.eth_event.echo) >> ECORE_SWCID_SHIFT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t client_info_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_obj* p_ecore_vlan_mac_obj = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi unsigned long ramrod_flags = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = ECORE_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int i;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_info_idx = lm_get_sw_client_idx_from_cid(pdev,cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Relevant to 57710, mcast is implemented as "set-macs"*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (type == ECORE_FILTER_MCAST_PENDING)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!CHIP_IS_E1(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_mcast_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (type)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ECORE_FILTER_MAC_PENDING:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi raw = &pdev->client_info[client_info_idx].mac_obj.raw;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi p_ecore_vlan_mac_obj = &pdev->client_info[client_info_idx].mac_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ECORE_FILTER_VLAN_MAC_PENDING:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi raw = &pdev->client_info[client_info_idx].mac_vlan_obj.raw;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi p_ecore_vlan_mac_obj = &pdev->client_info[client_info_idx].mac_vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ECORE_FILTER_VLAN_PENDING:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi raw = &pdev->client_info[client_info_idx].vlan_obj.raw;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi p_ecore_vlan_mac_obj = &pdev->client_info[client_info_idx].vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_BIT( ramrod_flags, RAMROD_CONT );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* unknown ER handling*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Special handling for case that type is unknown (error recovery flow)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * check which object is pending, and clear the relevant one. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi raw = &pdev->client_info[client_info_idx].mac_obj.raw;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi p_ecore_vlan_mac_obj = &pdev->client_info[client_info_idx].mac_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi type = ECORE_FILTER_MAC_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!raw->check_pending(raw))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi raw = &pdev->client_info[client_info_idx].mac_vlan_obj.raw;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi p_ecore_vlan_mac_obj = &pdev->client_info[client_info_idx].mac_vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi type = ECORE_FILTER_VLAN_MAC_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!raw->check_pending(raw))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi raw = &pdev->client_info[client_info_idx].vlan_obj.raw;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi p_ecore_vlan_mac_obj = &pdev->client_info[client_info_idx].vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi type = ECORE_FILTER_VLAN_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = p_ecore_vlan_mac_obj->complete( pdev, p_ecore_vlan_mac_obj, elem, &ramrod_flags );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // We expect here only these 2 status (CQ61418)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf ( ( ECORE_SUCCESS != ecore_status ) && ( ECORE_PENDING != ecore_status ) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (( ECORE_SUCCESS != ecore_status ) && (!CHIP_IS_E1x(pdev)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "lm_eq_handle_classification_eqe: commands' length is above CLASSIFY_RULES_COUNT (the maximum length of commands' list for one execution), ecore_status = %d", ecore_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // verify that the mac_local mac_add1 & mac_add2 are continuous
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC( OFFSETOF( eth_stats_info_t, mac_local )+ sizeof(pdev->vars.stats.stats_mirror.stats_drv.drv_info_to_mfw.eth_stats.mac_local) == OFFSETOF( eth_stats_info_t, mac_add1 ) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC( OFFSETOF( eth_stats_info_t, mac_add1 ) + sizeof(pdev->vars.stats.stats_mirror.stats_drv.drv_info_to_mfw.eth_stats.mac_add1) == OFFSETOF( eth_stats_info_t, mac_add2 ) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( (NDIS_CID(pdev) == client_info_idx) && (type == ECORE_FILTER_MAC_PENDING) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( NULL == p_ecore_vlan_mac_obj->get_n_elements )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( !CHIP_IS_E1x(pdev) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // We want to keep only eth mac this is for E3 only but we keep it anyway also for E2...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < 3; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(pdev->vars.stats.stats_mirror.stats_drv.drv_info_to_mfw.eth_stats.mac_local + i, sizeof(u8_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi p_ecore_vlan_mac_obj->get_n_elements(pdev, p_ecore_vlan_mac_obj ,3, pdev->vars.stats.stats_mirror.stats_drv.drv_info_to_mfw.eth_stats.mac_local + MAC_PAD, MAC_PAD, ETH_ALEN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->client_info[client_info_idx].set_mac_cookie)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cookie = (void *)pdev->client_info[client_info_idx].set_mac_cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[client_info_idx].set_mac_cookie = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_set_done(pdev, cid, cookie);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_IS_E1x(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_ETH_SET_MAC, ETH_CONNECTION_TYPE, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_ETH_CLASSIFICATION_RULES, ETH_CONNECTION_TYPE, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void lm_eq_handle_stats_eqe(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Order is important!!!
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * stats use a predefined ramrod. We need to make sure that we first complete the ramrod, which will
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * take it out of sq-completed list, and only after that mark the ramrod as completed, so that a new
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * ramrod can be sent!.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_HIGH,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_COMMON_STAT_QUERY, NONE_CONNECTION_TYPE, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_write_barrier(); /* barrier to make sure command before this line completes before executing the next line! */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.stats.stats_collect.stats_fw.b_ramrod_completed = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void lm_eq_handle_filter_rules_eqe(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_ramrod_params p;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * cookie = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cid = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid = mm_le32_to_cpu(elem->message.data.eth_event.echo) & ECORE_SWCID_MASK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMeq | INFORMl2sp, "Filter rule completion: cid %d, client_info %d\n",cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // FIXME: pdev->client_info[cid].mac_obj.raw.clear_pending(&pdev->client_info[cid].mac_obj.raw);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_CLEAR_BIT(ECORE_FILTER_RX_MODE_PENDING, &pdev->client_info[cid].sp_rxmode_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->client_info[cid].set_rx_mode_cookie)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cookie = (void *)pdev->client_info[cid].set_rx_mode_cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[cid].set_rx_mode_cookie = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMl2sp, "Filter rule calling mm_set_done... \n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_set_done(pdev, cid, cookie);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_CMD_ID_ETH_FILTER_RULES, ETH_CONNECTION_TYPE, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->client_info[cid].b_vlan_only_in_process)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[cid].b_vlan_only_in_process = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi p.vlan_mac_obj = &pdev->client_info[cid].vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi p.ramrod_flags = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_BIT( (p.ramrod_flags), RAMROD_CONT );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_config_vlan_mac(pdev, &p);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void lm_eq_handle_rss_update_eqe(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_raw_obj * raw = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * cookie = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cid = LM_SW_LEADING_RSS_CID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t abs_vf_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMeq | INFORMl2sp, "lm_eth_comp_cb: EVENT_RING_OPCODE_RSS_UPDATE_RULES\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid = mm_le32_to_cpu(elem->message.data.eth_event.echo) & ECORE_SWCID_MASK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_CHANNEL_VIRT_MODE_MASTER_PFDEV(pdev) && (cid >= MAX_RX_CHAIN(pdev)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi abs_vf_id = GET_ABS_VF_ID_FROM_PF_CID(cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info = lm_pf_find_vf_info_by_abs_id(pdev, abs_vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!vf_info);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi raw = &vf_info->vf_slowpath_info.rss_conf_obj.raw;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi raw->clear_pending(raw);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi raw = &pdev->slowpath_info.rss_conf_obj.raw;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi raw->clear_pending(raw);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_dec(&pdev->params.update_comp_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (mm_atomic_dec(&pdev->params.update_suspend_cnt) == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->slowpath_info.set_rss_cookie != NULL)
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, cid, cookie);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_CMD_ID_ETH_RSS_UPDATE, ETH_CONNECTION_TYPE, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_eq_handle_niv_function_update_eqe
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * handle a NIV function update completion.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev the device
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param elem the CQE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void lm_eq_handle_function_update_eqe(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((FUNC_UPDATE_RAMROD_SOURCE_NIV != elem->message.data.function_update_event.echo) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (FUNC_UPDATE_RAMROD_SOURCE_L2MP != elem->message.data.function_update_event.echo) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (FUNC_UPDATE_RAMROD_SOURCE_ENCAP != elem->message.data.function_update_event.echo) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (FUNC_UPDATE_RAMROD_SOURCE_UFP != elem->message.data.function_update_event.echo));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(elem->message.data.function_update_event.echo)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case FUNC_UPDATE_RAMROD_SOURCE_NIV:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((pdev->slowpath_info.niv_ramrod_state == NIV_RAMROD_COMPLETED)||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pdev->slowpath_info.niv_ramrod_state == NIV_RAMROD_NOT_POSTED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( NIV_RAMROD_SET_LOOPBACK_POSTED == pdev->slowpath_info.niv_ramrod_state )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_PHY_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.link_status = LM_STATUS_LINK_ACTIVE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_indicate_link(pdev, pdev->vars.link_status, pdev->vars.medium);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_PHY_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (NIV_RAMROD_CLEAR_LOOPBACK_POSTED == pdev->slowpath_info.niv_ramrod_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_PHY_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.link_status = LM_STATUS_LINK_DOWN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_indicate_link(pdev, pdev->vars.link_status, pdev->vars.medium);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_PHY_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.niv_ramrod_state = NIV_RAMROD_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case FUNC_UPDATE_RAMROD_SOURCE_L2MP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.l2mp_func_update_ramrod_state = L2MP_FUNC_UPDATE_RAMROD_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case FUNC_UPDATE_RAMROD_SOURCE_ENCAP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->encap_info.current_encap_offload_state =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->encap_info.new_encap_offload_state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->encap_info.update_cookie)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void* cookie = (void*)pdev->encap_info.update_cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->encap_info.update_cookie = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_set_done(pdev, LM_CLI_IDX_NDIS, cookie);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case FUNC_UPDATE_RAMROD_SOURCE_UFP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((pdev->slowpath_info.ufp_func_ramrod_state == UFP_RAMROD_COMPLETED)||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pdev->slowpath_info.ufp_func_ramrod_state == UFP_RAMROD_NOT_POSTED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // In case of link update, indicate the link status to miniport, else it is just
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // svid update which doesnt need anymore processing.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( UFP_RAMROD_PF_LINK_UPDATE_POSTED == pdev->slowpath_info.ufp_func_ramrod_state )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_PHY_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.link_status = LM_STATUS_LINK_ACTIVE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_indicate_link(pdev, pdev->vars.link_status, pdev->vars.medium);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_PHY_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (UFP_RAMROD_PF_UPDATE_POSTED != pdev->slowpath_info.ufp_func_ramrod_state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.ufp_func_ramrod_state = UFP_RAMROD_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_eq_handle_function_update_eqe unknown source");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NONE_CONNECTION_TYPE, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_eq_handle_niv_function_update_eqe
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * handle a NIV lists update completion.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev the device
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param elem the CQE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void lm_eq_handle_niv_vif_lists_eqe(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((pdev->slowpath_info.niv_ramrod_state != NIV_RAMROD_VIF_LISTS_POSTED) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (!lm_reset_is_inprogress(pdev)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((elem->message.data.vif_list_event.echo != VIF_LIST_RULE_CLEAR_ALL) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (elem->message.data.vif_list_event.echo != VIF_LIST_RULE_CLEAR_FUNC) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (elem->message.data.vif_list_event.echo != VIF_LIST_RULE_GET) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (elem->message.data.vif_list_event.echo != VIF_LIST_RULE_SET));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (elem->message.data.vif_list_event.echo == VIF_LIST_RULE_GET)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.last_vif_list_bitmap = (u8_t)elem->message.data.vif_list_event.func_bit_map;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!lm_reset_is_inprogress(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.niv_ramrod_state = NIV_RAMROD_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, RAMROD_CMD_ID_COMMON_AFEX_VIF_LISTS,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi NONE_CONNECTION_TYPE, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void lm_eq_handle_vf_flr_eqe(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t abs_vf_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi abs_vf_id = elem->message.data.vf_flr_event.vf_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_eq_handle_vf_flr_eqe(%d)\n",elem->message.data.vf_flr_event.vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info = lm_pf_find_vf_info_by_abs_id(pdev, (u8_t)abs_vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!vf_info) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_eq_handle_vf_flr_eqe: vf_info is not found\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->was_flred = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_VFS_STATS_LOCK_DPC(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((vf_info->vf_stats.vf_stats_state != VF_STATS_NONE) && (vf_info->vf_stats.vf_stats_state != VF_STATS_REQ_IN_PROCESSING)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->vf_stats.vf_stats_state = VF_STATS_REQ_READY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->vf_stats.stop_collect_stats = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->vf_stats.vf_stats_flag = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_VFS_STATS_LOCK_DPC(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE void lm_eq_handle_malicious_vf_eqe(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t abs_vf_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi abs_vf_id = elem->message.data.malicious_vf_event.vf_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info = lm_pf_find_vf_info_by_abs_id(pdev, (u8_t)abs_vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vf_info) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->was_malicious = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_report_malicious_vf(pdev, vf_info);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_eq_handle_malicious_vf_eqe(%d)\n",abs_vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic INLINE lm_status_t lm_service_eq_elem(struct _lm_device_t * pdev, union event_ring_elem * elem)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* handle eq element */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(elem->message.opcode)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_FUNCTION_START:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_function_start_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_FUNCTION_STOP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_function_stop_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_CFC_DEL:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_CFC_DEL_WB:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_cfc_del_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_SET_MAC:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_CLASSIFICATION_RULES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_classification_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_STAT_QUERY:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_stats_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_STOP_TRAFFIC:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->dcbx_info.dcbx_ramrod_state = FUNCTION_DCBX_STOP_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_MEDIUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_COMMON_STOP_TRAFFIC, NONE_CONNECTION_TYPE, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_START_TRAFFIC:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->dcbx_info.dcbx_ramrod_state = FUNCTION_DCBX_START_COMPLETED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_HIGH,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_COMMON_START_TRAFFIC, NONE_CONNECTION_TYPE, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_FORWARD_SETUP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_fwd_setup_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_MULTICAST_RULES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_mcast_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_FILTERS_RULES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_filter_rules_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_RSS_UPDATE_RULES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_rss_update_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_FUNCTION_UPDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_function_update_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_AFEX_VIF_LISTS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_niv_vif_lists_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_VF_FLR:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_vf_flr_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case EVENT_RING_OPCODE_MALICIOUS_VF:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_handle_malicious_vf_eqe(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("Unknown elem type received on eq\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * handle cqes of the event-ring, should be called from dpc if index in status block was changed
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t SUCCESS or FAILURE (if unknown completion)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_service_eq_intr(struct _lm_device_t * pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi union event_ring_elem * elem = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_chain_t * eq_chain = &pdev->eq_info.eq_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t cq_new_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t cq_old_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cq_new_idx = mm_le16_to_cpu(*(eq_chain->hw_con_idx_ptr));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if((cq_new_idx & lm_bd_chain_usable_bds_per_page(&eq_chain->bd_chain))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi == lm_bd_chain_usable_bds_per_page(&eq_chain->bd_chain))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cq_new_idx+=lm_bd_chain_bds_skip_eop(&eq_chain->bd_chain);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cq_old_idx = lm_bd_chain_cons_idx(&eq_chain->bd_chain);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* there is no change in the EQ consumer index so exit! */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cq_old_idx == cq_new_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMeq , "there is no change in the EQ consumer index so exit!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMeq , "EQ consumer index: cq_old_idx=0x%x, cq_new_idx=0x%x!\n",cq_old_idx,cq_new_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while(cq_old_idx != cq_new_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfFastPath(S16_SUB(cq_new_idx, cq_old_idx) <= 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* get hold of the cqe, and find out what it's type corresponds to */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem = (union event_ring_elem *)lm_bd_chain_consume_bd(&eq_chain->bd_chain);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (elem == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfFastPath(elem == NULL);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cq_old_idx = lm_bd_chain_cons_idx(&eq_chain->bd_chain);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_service_eq_elem(pdev, elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef __LINUX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_common_ramrod_comp_cb(pdev, &elem->message);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif //__LINUX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Recycle the cqe */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_bd_produced(&eq_chain->bd_chain);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } /* while */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* update producer */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi eq_chain->iro_prod_offset,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_prod_idx(&eq_chain->bd_chain),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_service_eq_intr */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This function completes eq completions immediately
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * (without fw completion).
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param spe
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_eq_comp_cb(struct _lm_device_t *pdev, struct sq_pending_command * pending)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi union event_ring_elem elem = {{0}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cid = pending->cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t cmd = pending->cmd;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* We need to build the "elem" based on the spe */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pending->type & SPE_HDR_T_CONN_TYPE) == ETH_CONNECTION_TYPE) /* Some Ethernets complete on Eq. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (cmd)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_SET_MAC:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_SET_MAC;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.data.eth_event.echo = (0xff << ECORE_SWCID_SHIFT | cid); /*unknown type*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_CLASSIFICATION_RULES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_CLASSIFICATION_RULES;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.data.eth_event.echo = (0xff << ECORE_SWCID_SHIFT | cid); /*unknown type*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_FORWARD_SETUP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_FORWARD_SETUP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_MULTICAST_RULES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_MULTICAST_RULES;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.data.eth_event.echo = cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_FILTER_RULES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_FILTERS_RULES;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.data.eth_event.echo = cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_RSS_UPDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_RSS_UPDATE_RULES;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("Unknown elem type received on eq\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if ((pending->type & SPE_HDR_T_CONN_TYPE)== NONE_CONNECTION_TYPE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (cmd)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_COMMON_FUNCTION_START:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_FUNCTION_START;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_COMMON_FUNCTION_STOP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_FUNCTION_STOP;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_COMMON_CFC_DEL:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_CFC_DEL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.data.cfc_del_event.cid = cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_COMMON_CFC_DEL_WB:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_CFC_DEL_WB;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.data.cfc_del_event.cid = cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_COMMON_STAT_QUERY:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_STAT_QUERY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_COMMON_STOP_TRAFFIC:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_STOP_TRAFFIC;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_COMMON_START_TRAFFIC:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_START_TRAFFIC;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_FUNCTION_UPDATE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_COMMON_AFEX_VIF_LISTS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elem.message.opcode = EVENT_RING_OPCODE_AFEX_VIF_LISTS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("Unknown elem type received on eq\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_service_eq_elem(pdev, &elem);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*********************** SQ RELATED FUNCTIONS ***************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* TODO: move more functions from command.h to here. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_cid_recycled_cb_register(struct _lm_device_t *pdev, u8_t type, lm_cid_recycled_cb_t cb)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CHK_NULL(cb) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF( type >= ARRSIZE( pdev->cid_recycled_callbacks ) ) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF( NULL != pdev->cid_recycled_callbacks[type] ) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!cb) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( type >= ARRSIZE( pdev->cid_recycled_callbacks ) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( NULL != pdev->cid_recycled_callbacks[type] ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->cid_recycled_callbacks[type]= cb;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_cid_recycled_cb_deregister(struct _lm_device_t *pdev, u8_t type)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF( type >= ARRSIZE( pdev->cid_recycled_callbacks ) ) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CHK_NULL(pdev->cid_recycled_callbacks[type]) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( type >= ARRSIZE( pdev->cid_recycled_callbacks ) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->cid_recycled_callbacks[type] = (lm_cid_recycled_cb_t)NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_sq_change_state(struct _lm_device_t *pdev, lm_sq_state_t state)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORM, "Changing sq state from %d to %d\n", pdev->sq_info.sq_state, state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.sq_state = state;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * function completes pending slow path requests instead of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * FW. Used in error recovery flow.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * interrupts at this point are disabled and dpcs are
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * flushed, thus no one else can complete these...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_sq_complete_pending_requests(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi enum connection_type type = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct sq_pending_command * pending = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_sq_complete_pending_requests\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* unexpected if not under error recovery */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!pdev->params.enable_error_recovery);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Find the first entry that hasn't been handled yet. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* We just peek and don't pop since completion of this pending request should contain removing
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * it from the completion list. However, it may not happen immediately */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pending = (struct sq_pending_command *)d_list_peek_head(&pdev->sq_info.pending_complete);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Look for the first entry that is "pending" but not completion_called yet. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (pending && GET_FLAGS(pending->flags, SQ_PEND_COMP_CALLED))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pending = (struct sq_pending_command *)d_list_next_entry(&pending->list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Mark pending completion as "handled" so that we don't handle it again... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pending)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(pending->flags, SQ_PEND_COMP_CALLED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pending)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi type = pending->type & SPE_HDR_T_CONN_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->sq_info.sq_comp_cb[type])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.sq_comp_cb[type](pdev, pending);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("unsupported pending sq: Not implemented yet\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * lm_sq_post_pending can only cause (via lm_sq_flush)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * lm_sq_complete_pending_requests DPC to be scheduled if
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * pdev->sq_info.sq_comp_scheduled==FALSE. Such scheduling
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * is acompnied by sq_comp_scheduled being set to TRUE.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * If we avoid setting pdev->sq_info.sq_comp_scheduled to FALSE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * we are gurenteed lm_sq_complete_pending_requests will not be
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * re-scheduled here.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_post_pending(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } while (!d_list_is_empty(&pdev->sq_info.pending_complete));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * We are done completing pending requests in pending_list. However, any
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * new sp requests created by callbacks, need service.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * As we are outside the SPQ lock, this DPC may be preempted,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * lm_sq_flush may have been called somewhere before this point.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.sq_comp_scheduled = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * check if there is more to be flushed (new SPQ that entered after
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the "while".)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pdev->sq_info.sq_state == SQ_STATE_PENDING) && !d_list_is_empty(&pdev->sq_info.pending_complete))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_flush(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_sq_flush(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t schedule_wi = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pdev->sq_info.sq_comp_scheduled == FALSE) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ((pdev->sq_info.num_pending_high != MAX_HIGH_PRIORITY_SPE) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pdev->sq_info.num_pending_normal != MAX_NORMAL_PRIORITY_SPE)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi schedule_wi = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.sq_comp_scheduled = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (schedule_wi)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = MM_REGISTER_DPC(pdev, lm_sq_complete_pending_requests);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Alternative: WorkItem...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = MM_REGISTER_LPME(pdev, lm_sq_complete_pending_requests, FALSE, FALSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status == LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
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 Mustacchilm_status_t lm_sq_comp_cb_register(struct _lm_device_t *pdev, u8_t type, lm_sq_comp_cb_t cb)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CHK_NULL(cb) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF( type >= ARRSIZE( pdev->sq_info.sq_comp_cb ) ) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF( NULL != pdev->sq_info.sq_comp_cb[type] ) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.sq_comp_cb[type]= cb;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_sq_comp_cb_deregister(struct _lm_device_t *pdev, u8_t type)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF( type >= ARRSIZE( pdev->sq_info.sq_comp_cb ) ) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CHK_NULL(pdev->sq_info.sq_comp_cb[type]) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.sq_comp_cb[type] = (lm_sq_comp_cb_t)NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_sq_is_empty(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t empty = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pdev->sq_info.num_pending_high != MAX_HIGH_PRIORITY_SPE) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pdev->sq_info.num_pending_normal != MAX_NORMAL_PRIORITY_SPE))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi empty = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return empty;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Posts from the normal + high priority lists as much as it
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * can towards the FW.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Assumptions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * called under SQ_LOCK!!!
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t PENDING: if indeed requests were posted,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * SUCCESS o/w
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_sq_post_from_list(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct sq_pending_command * pending = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (pdev->sq_info.num_pending_normal)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pending = (void*)d_list_pop_head(&pdev->sq_info.pending_normal);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!pending)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.num_pending_normal --;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORM, "lm_sq_post: priority=%d, command=%d, type=%d, cid=%d num_pending_normal=%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_NORMAL, pending->cmd, pending->type, pending->cid, pdev->sq_info.num_pending_normal);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_tail(&pdev->sq_info.pending_complete, &pending->list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_sq_post(pdev,pending);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* post high priority sp */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (pdev->sq_info.num_pending_high)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pending = (void*)d_list_pop_head(&pdev->sq_info.pending_high);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!pending)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.num_pending_high --;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORM, "lm_sq_post: priority=%d, command=%d, type=%d, cid=%d num_pending_normal=%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_HIGH, pending->cmd, pending->type, pending->cid, pdev->sq_info.num_pending_normal);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_tail(&pdev->sq_info.pending_complete, &pending->list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_sq_post(pdev, pending);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Add the entry to the pending SP list.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Try to add entry's from the list to the sq_chain if possible.(there is are less then 8 ramrod commands pending)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pending - The pending list entry.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param priority - (high or low) to witch list to insert the pending list entry.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t: LM_STATUS_SUCCESS on success or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * LM_STATUS_REQUEST_NOT_ACCEPTED if slowpath queue is
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * in blocked state.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_sq_post_entry(struct _lm_device_t * pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct sq_pending_command * pending,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t priority)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t sq_flush = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(! pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->sq_info.sq_state == SQ_STATE_BLOCKED)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // This state is valid in case hw failure such as fan failure happened.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // so we removed assert was here before and changed only to trace CQ62337
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_sq_post_entry: Unexpected slowpath command SQ_STATE_BLOCKED\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_REQUEST_NOT_ACCEPTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* We shouldn't be posting any entries if the function-stop has already been posted... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (((mm_le32_to_cpu(pending->command.hdr.conn_and_cmd_data) & SPE_HDR_T_CMD_ID)>>SPE_HDR_T_CMD_ID_SHIFT) != RAMROD_CMD_ID_COMMON_FUNCTION_STOP)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf((pdev->eq_info.function_state == FUNCTION_STOP_POSTED) || (pdev->eq_info.function_state == FUNCTION_STOP_COMPLETED));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch( priority )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CMD_PRIORITY_NORMAL:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* add the request to the list tail*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_tail(&pdev->sq_info.pending_normal, &pending->list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CMD_PRIORITY_MEDIUM:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* add the request to the list head*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_head(&pdev->sq_info.pending_normal, &pending->list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CMD_PRIORITY_HIGH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* add the request to the list head*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_push_head(&pdev->sq_info.pending_high, &pending->list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( 1 ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // TODO_ROLLBACK - free sq_pending_command
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!(pdev->sq_info.num_pending_normal))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_COMMON_DRV_STATS_ATOMIC_INC_ETH(pdev, tx_no_sq_wqe);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_sq_post_from_list(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status == LM_STATUS_PENDING)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* New slowpath was posted in pending state... make sure to flush sq
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * after this... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->sq_info.sq_state == SQ_STATE_PENDING)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sq_flush = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (sq_flush)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_flush(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi post a ramrod to the sq
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi takes the sq pending list spinlock and adds the request
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi will not block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi but the actuall posting to the sq might be deffered until there is room
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MUST only have one request pending per CID (this is up to the caller to enforce)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_sq_post(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t command,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t priority,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t type,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u64_t data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct sq_pending_command *pending = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(! pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(! command); /* todo: make this more detailed*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* allocate a new command struct and fill it */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pending = mm_get_sq_pending_command(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( !pending )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_post_fill_entry(pdev,pending,cid,command,type,data,TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_sq_post_entry(pdev,pending,priority);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi inform the sq mechanism of completed ramrods
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi because the completions arrive on the fast-path rings
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi the fast-path needs to inform the sq that the ramrod has been serviced
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi will not block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi does not take any locks
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_sq_complete(struct _lm_device_t *pdev, u8_t priority,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t command, u16_t type, u32_t cid )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct sq_pending_command *pending = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORM, "lm_sq_complete: priority=%d, command=%d, type=%d, cid=%d num_pending_normal=%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi priority, command, type, cid, pdev->sq_info.num_pending_normal);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch( priority )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CMD_PRIORITY_NORMAL:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CMD_PRIORITY_MEDIUM:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.num_pending_normal ++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->sq_info.num_pending_normal > MAX_NORMAL_PRIORITY_SPE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CMD_PRIORITY_HIGH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.num_pending_high ++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->sq_info.num_pending_high > MAX_HIGH_PRIORITY_SPE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( 1 ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* update sq consumer */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.sq_chain.con_idx ++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.sq_chain.bd_left ++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Search for the completion in the pending_complete list*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Currently only supported if error recovery is supported */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pending = (void*)d_list_peek_head(&pdev->sq_info.pending_complete);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.validate_sq_complete)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!pending); /* not expected, but will deal with it... just won't */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.validate_sq_complete)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (pending)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (((pending->type & SPE_HDR_T_CONN_TYPE) == type) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pending->cmd == command) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pending->cid == cid))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* got it... remove from list and free it */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_remove_entry(&pdev->sq_info.pending_complete, &pending->list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(GET_FLAGS(pending->flags, SQ_PEND_RELEASE_MEM))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_return_sq_pending_command(pdev, pending);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pending = (void*)d_list_next_entry(&pending->list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TODO_ER: on no validation, just take the head... Workaround for mc-diag */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pending = (void*)d_list_pop_head(&pdev->sq_info.pending_complete);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pending))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_sq_complete pending is NULL");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if((GET_FLAGS(pending->flags, SQ_PEND_RELEASE_MEM)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_return_sq_pending_command(pdev, pending);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!pending); /* means none were found, assert but can deal with it... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * do any deffered posting pending on the sq, will take the list spinlock
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * will not block. Check sq state, if its pending (it means no hw...) call flush
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * at the end, which will take care of completing these completions internally.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t SUCCESS: is no pending requests were sent. PENDING if a
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * if pending request was sent.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_sq_post_pending(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t sq_flush = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( CHK_NULL(pdev) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_sq_post_from_list(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status == LM_STATUS_PENDING)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* New slowpath was posted in pending state... make sure to flush sq
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * after this... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->sq_info.sq_state == SQ_STATE_PENDING)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sq_flush = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_SPQ_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (sq_flush)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_flush(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*********************** ETH SLOWPATH RELATED FUNCTIONS ***************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_eth_init_command_comp(struct _lm_device_t *pdev, struct common_ramrod_eth_rx_cqe *cqe)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tpa_info_t* tpa_info = &LM_TPA_INFO(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void * cookie = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t conn_and_cmd_data = mm_le32_to_cpu(cqe->conn_and_cmd_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cid = SW_CID(conn_and_cmd_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi enum eth_spqe_cmd_id command = conn_and_cmd_data >> COMMON_RAMROD_ETH_RX_CQE_CMD_ID_SHIFT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t ramrod_type = cqe->ramrod_type;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t empty_data = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t connection_info_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t max_eth_cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl2sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "lm_eth_comp_cb: completion for cid=%d, command %d(0x%x)\n", cid, command, command);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfAll(ramrod_type & COMMON_RAMROD_ETH_RX_CQE_ERROR);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi connection_info_idx = lm_get_sw_client_idx_from_cid(pdev,cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (command)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_CLIENT_SETUP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_get_con_state(pdev, cid) != LM_CON_STATE_OPEN_SENT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, cid, LM_CON_STATE_OPEN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl2sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "lm_eth_comp_cb: RAMROD ETH SETUP completed for cid=%d, - calling lm_extract_ramrod_req!\n", cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_TX_QUEUE_SETUP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_get_con_state(pdev, cid) != LM_CON_STATE_OPEN_SENT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, cid, LM_CON_STATE_OPEN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl2sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "lm_eth_comp_cb: RAMROD ETH SETUP completed for cid=%d, - calling lm_extract_ramrod_req!\n", cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_CLIENT_UPDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(PFDEV(pdev)->client_info[connection_info_idx].update.state != LM_CLI_UPDATE_USED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PFDEV(pdev)->client_info[connection_info_idx].update.state = LM_CLI_UPDATE_RECV;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl2sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "lm_eth_comp_cb: RAMROD ETH Update completed for cid=%d, - calling lm_extract_ramrod_req!\n", cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_HALT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_get_con_state(pdev, cid) != LM_CON_STATE_HALT_SENT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, cid, LM_CON_STATE_HALT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl2sp, "lm_eth_comp_cb:RAMROD_CMD_ID_ETH_HALT- calling lm_extract_ramrod_req!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_EMPTY:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi empty_data = mm_le32_to_cpu(cqe->protocol_data.data_lo);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_EMPTY_RAMROD_RECEIVED(pdev,empty_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl2sp, "lm_eth_comp_cb:RAMROD_CMD_ID_ETH_EMPTY- calling lm_extract_ramrod_req!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_TPA_UPDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl2sp, "lm_eth_comp_cb:RAMROD_CMD_ID_ETH_TPA_UPDATE- calling lm_extract_ramrod_req!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (MM_DCB_MP_L2_IS_ENABLE(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi max_eth_cid = lm_mp_max_cos_chain_used(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi max_eth_cid = LM_SB_CNT(pdev) + MAX_NON_RSS_CHAINS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_CHANNEL_VIRT_MODE_MASTER_PFDEV(pdev) && (cid >= max_eth_cid))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t abs_vf_id = 0xff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t vf_q_id = 0xff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi abs_vf_id = GET_ABS_VF_ID_FROM_PF_CID(cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_q_id = GET_VF_Q_ID_FROM_PF_CID(cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info = lm_pf_find_vf_info_by_abs_id(pdev, abs_vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!vf_info);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_dec((u32_t*)(&vf_info->vf_tpa_info.ramrod_recv_cnt));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid = GET_VF_Q_ID_FROM_PF_CID(cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (0 == mm_atomic_dec((u32_t*)(&tpa_info->ramrod_recv_cnt)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_info->ipvx_enabled_current = tpa_info->ipvx_enabled_required;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_info->state = TPA_STATE_NONE; /* Done with ramrods... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (tpa_info->update_cookie)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cookie = (void *)tpa_info->update_cookie;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_info->update_cookie = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_set_done(pdev, cid, cookie);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return; /*To prevent lm_sq_completion processing for non existing (not submited) pending item*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_TERMINATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_get_con_state(pdev, cid) != LM_CON_STATE_HALT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_con_state(pdev, cid, LM_CON_STATE_TERMINATE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARNl2sp, "lm_eth_comp_cb:RAMROD_CMD_ID_ETH_TERMINATE- calling lm_extract_ramrod_req!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL,"lm_eth_init_command_comp_cb unhandled ramrod comp command=%d\n",command);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(1); // unhandled ramrod!
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef __LINUX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_eth_ramrod_comp_cb(pdev, cqe);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif //__LINUX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_complete(pdev, CMD_PRIORITY_NORMAL, command, ETH_CONNECTION_TYPE, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Function is the callback function for completing eth
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * completions when no chip access exists. Part of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * "complete-pending-sq" flow
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param spe
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_eth_comp_cb(struct _lm_device_t *pdev, struct sq_pending_command * pending)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct common_ramrod_eth_rx_cqe cqe;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* The idea is to prepare a cqe and call: common_ramrod_eth_rx_cqe */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cqe.conn_and_cmd_data = pending->command.hdr.conn_and_cmd_data;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cqe.ramrod_type = RX_ETH_CQE_TYPE_ETH_RAMROD;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cqe.protocol_data.data_hi = pending->command.protocol_data.hi;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cqe.protocol_data.data_lo = pending->command.protocol_data.lo;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (pending->cmd)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Ramrods that complete on the EQ */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_RSS_UPDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_FILTER_RULES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_MULTICAST_RULES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_FORWARD_SETUP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_CLASSIFICATION_RULES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_SET_MAC:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_comp_cb(pdev, pending);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Ramrods that complete on the RCQ */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_CLIENT_SETUP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_TX_QUEUE_SETUP:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_CLIENT_UPDATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_HALT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_EMPTY:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case RAMROD_CMD_ID_ETH_TERMINATE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eth_init_command_comp(pdev, &cqe);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("Unknown cmd");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_check_mac_addr_exist(struct _lm_device_t *pdev, u8_t chain_idx, u8_t *mac_addr, u16_t vlan_tag, u8_t is_encap_inner_mac_filter)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct ecore_vlan_mac_obj *dest_obj = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status_t ecore_status = ECORE_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t is_exist = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi union ecore_classification_ramrod_data
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi classification_ramrod_data = {{{0}}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ERR_IF(!pdev || !mac_addr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_move_mac_addr: invalid params\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_reset_is_inprogress(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_move_mac_addr: Under FLR!!!\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vlan_tag != LM_SET_CAM_NO_VLAN_FILTER)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dest_obj = &pdev->client_info[chain_idx].mac_vlan_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(classification_ramrod_data.vlan_mac.mac, mac_addr, sizeof(classification_ramrod_data.vlan_mac.mac));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi classification_ramrod_data.vlan_mac.vlan = vlan_tag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi classification_ramrod_data.vlan_mac.is_inner_mac = is_encap_inner_mac_filter;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dest_obj = &pdev->client_info[chain_idx].mac_obj;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(classification_ramrod_data.mac.mac, mac_addr, sizeof(classification_ramrod_data.mac.mac) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi classification_ramrod_data.mac.is_inner_mac = is_encap_inner_mac_filter;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_status = dest_obj->check_add(pdev,dest_obj,&classification_ramrod_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ecore_status == ECORE_EXISTS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi is_exist = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (ecore_status == ECORE_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi is_exist = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return is_exist;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_update_default_vlan(IN struct _lm_device_t *pdev, IN u8_t client_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u16_t silent_vlan_value,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u16_t silent_vlan_mask,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t silent_vlan_removal_flg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t silent_vlan_change_flg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u16_t default_vlan,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t default_vlan_enable_flg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t default_vlan_change_flg)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct client_update_ramrod_data * client_update_data_virt = pdev->client_info[client_idx].update.data_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t con_state = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u32_t cid = client_idx; //lm_get_cid_from_sw_client_idx(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(client_update_data_virt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(client_update_data_virt , sizeof(struct client_update_ramrod_data));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // We will send a client update ramrod in any case we can we don't optimize this flow.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Client setup may already took the correct NIV value but the ramrod will be sent anyway
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi con_state = lm_get_con_state(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if((LM_CON_STATE_OPEN != con_state) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (LM_CON_STATE_OPEN_SENT != con_state))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Clinet is not in a state that it can recieve the ramrod
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_ABORTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* We don't expect this function to be called for non eth regular connections.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * If we hit this assert it means we need support for SRIOV + AFEX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid >= MAX_RX_CHAIN(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(cid >= MAX_RX_CHAIN(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( LM_CLI_UPDATE_NOT_USED != pdev->client_info[client_idx].update.state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[client_idx].update.state = LM_CLI_UPDATE_USED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->client_id = LM_FW_CLI_ID(pdev, client_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->func_id = FUNC_ID(pdev); /* FIXME: VFID needs to be given here for VFs... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->silent_vlan_value = mm_cpu_to_le16(silent_vlan_value);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->silent_vlan_mask = mm_cpu_to_le16(silent_vlan_mask);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->silent_vlan_removal_flg = silent_vlan_removal_flg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->silent_vlan_change_flg = silent_vlan_change_flg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->refuse_outband_vlan_flg = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->refuse_outband_vlan_change_flg = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->default_vlan = default_vlan;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->default_vlan_enable_flg = default_vlan_enable_flg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->default_vlan_change_flg = default_vlan_change_flg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_sq_post(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_ETH_CLIENT_UPDATE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_MEDIUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ETH_CONNECTION_TYPE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[client_idx].update.data_phys.as_u64);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_wait_state_change(pdev, &pdev->client_info[client_idx].update.state, LM_CLI_UPDATE_RECV);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[client_idx].update.state = LM_CLI_UPDATE_NOT_USED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi