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 functions that deal with resource allocation and setup
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "lm5710.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "bd_chain.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "command.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "ecore_common.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "577xx_int_offsets.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "bcmtype.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// should be same as ceil (math.h) doesn't support u64_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define _ceil( _x_32, _divisor_32 ) ((_x_32 / _divisor_32) + ( (_x_32%_divisor_32) ? 1 : 0))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_clear_chain_sb_cons_idx(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u8_t sb_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_hc_sb_info_t *hc_sb_info,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN volatile u16_t ** hw_con_idx_ptr
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t port = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t func = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t rd_val = 0xFFFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t rd_val_32 = 0xFFFFFFFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t fw_sb_id = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t sb_lock_id = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHK_NULL(pdev) || CHK_NULL(hc_sb_info) || CHK_NULL(hw_con_idx_ptr))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_lock_id = lm_sb_id_from_chain(pdev, sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (sb_lock_id == DEF_STATUS_BLOCK_INDEX)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_lock_id = DEF_STATUS_BLOCK_IGU_INDEX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* make sure that the sb is not during processing while we
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * clear the pointer */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_SB_LOCK(pdev, sb_lock_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *hw_con_idx_ptr = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_SB_LOCK(pdev, sb_lock_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_reset_is_inprogress(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi port = PORT_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi func = FUNC_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi fw_sb_id = LM_FW_SB_ID(pdev, sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (hc_sb_info->hc_sb) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case STATUS_BLOCK_SP_SL_TYPE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev, CSTORM_SP_HC_SYNC_LINE_INDEX_OFFSET(hc_sb_info->hc_index_value,func), 0, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_READ16(pdev, CSTORM_SP_HC_SYNC_LINE_INDEX_OFFSET(hc_sb_info->hc_index_value,func), &rd_val, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfAll(rd_val != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev, (CSTORM_SP_STATUS_BLOCK_OFFSET(func) + OFFSETOF(struct hc_sp_status_block, index_values) + (hc_sb_info->hc_index_value * sizeof(u16_t))), 0, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_READ16 (pdev, (CSTORM_SP_STATUS_BLOCK_OFFSET(func) + OFFSETOF(struct hc_sp_status_block, index_values) + (hc_sb_info->hc_index_value * sizeof(u16_t))), &rd_val, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfAll(rd_val != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case STATUS_BLOCK_NORMAL_SL_TYPE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!LM_SB_ID_VALID(pdev, sb_id))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(PFDEV(pdev), CSTORM_HC_SYNC_LINE_DHC_OFFSET(hc_sb_info->hc_index_value, fw_sb_id), 0, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_READ32(PFDEV(pdev), CSTORM_HC_SYNC_LINE_DHC_OFFSET(hc_sb_info->hc_index_value, fw_sb_id), &rd_val_32, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfAll(rd_val_32 != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //Go to zeroing index value without break
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case STATUS_BLOCK_NORMAL_TYPE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_IS_E1x(PFDEV(pdev))) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(PFDEV(pdev), CSTORM_HC_SYNC_LINE_INDEX_E1X_OFFSET(hc_sb_info->hc_index_value, fw_sb_id), 0, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_READ16(PFDEV(pdev), CSTORM_HC_SYNC_LINE_INDEX_E1X_OFFSET(hc_sb_info->hc_index_value, fw_sb_id), &rd_val, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(PFDEV(pdev), CSTORM_HC_SYNC_LINE_INDEX_E2_OFFSET(hc_sb_info->hc_index_value, fw_sb_id), 0, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_READ16(PFDEV(pdev), CSTORM_HC_SYNC_LINE_INDEX_E2_OFFSET(hc_sb_info->hc_index_value, fw_sb_id), &rd_val, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfAll(rd_val != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_IS_E1x(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(PFDEV(pdev), (CSTORM_STATUS_BLOCK_OFFSET(fw_sb_id) + OFFSETOF(struct hc_status_block_e1x, index_values) + (hc_sb_info->hc_index_value * sizeof(u16_t))), 0, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_READ16 (PFDEV(pdev), (CSTORM_STATUS_BLOCK_OFFSET(fw_sb_id) + OFFSETOF(struct hc_status_block_e1x, index_values) + (hc_sb_info->hc_index_value * sizeof(u16_t))), &rd_val, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(PFDEV(pdev), (CSTORM_STATUS_BLOCK_OFFSET(fw_sb_id) + OFFSETOF(struct hc_status_block_e2, index_values) + (hc_sb_info->hc_index_value * sizeof(u16_t))), 0, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_READ16 (PFDEV(pdev), (CSTORM_STATUS_BLOCK_OFFSET(fw_sb_id) + OFFSETOF(struct hc_status_block_e2, index_values) + (hc_sb_info->hc_index_value * sizeof(u16_t))), &rd_val, BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(NULL, FATAL, "Invalid hc_sb value: 0x%x.\n", hc_sb_info->hc_sb);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* We read from the same memory and verify that it's 0 to make sure that the value was written to the grc and was not delayed in the pci */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfAll(rd_val != 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * reset txq, rxq, rcq counters for L2 client connection
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * assumption: the cid equals the chain idx
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * allocate given num of coalesce buffers, and queue them in the txq chain.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * 1 buffer is allocated for LSO packets, and the rest are allocated with
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * MTU size.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Return:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * lm_status
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_allocate_coalesce_buffers(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tx_chain_t *txq,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t coalesce_buf_cnt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_coalesce_buffer_t *last_coalesce_buf = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_coalesce_buffer_t *coalesce_buf = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t mem_phy = {{0}};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t * mem_virt = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mem_left = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mem_size = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t buf_size = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cnt = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t mm_cli_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check arguments */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pdev) || CHK_NULL(txq))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, VERBOSEi | VERBOSEl2sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "#lm_allocate_coalesce_buffers, coalesce_buf_cnt=%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx = cid_to_resource(pdev, cid); //!!DP mm_cli_idx_to_um_idx(LM_CHAIN_IDX_CLI(pdev, idx));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(coalesce_buf_cnt == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi buf_size = MAX_L2_CLI_BUFFER_SIZE(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = coalesce_buf_cnt * sizeof(lm_coalesce_buffer_t);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_virt = mm_alloc_mem(pdev,mem_size, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(ERR_IF(!mem_virt))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(mem_virt, 0, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Create a list of frame buffer descriptors. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf = (lm_coalesce_buffer_t *) mem_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(cnt = 0; cnt < coalesce_buf_cnt; cnt++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf->frags.cnt = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf->frags.size = 0; /* not in use */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf->buf_size = buf_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_push_tail(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &txq->coalesce_buf_list,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &coalesce_buf->link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Have at least one coalesce buffer large enough to copy
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * an LSO frame. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf = (lm_coalesce_buffer_t *) s_list_peek_head(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &txq->coalesce_buf_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf->buf_size = 0x10000; /* TBD: consider apply change here for GSO */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Determine the total memory for the coalesce buffers. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_left = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf = (lm_coalesce_buffer_t *) s_list_peek_head(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &txq->coalesce_buf_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while(coalesce_buf)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_left += coalesce_buf->buf_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf = (lm_coalesce_buffer_t *) s_list_next_entry(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &coalesce_buf->link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Initialize all the descriptors to point to a buffer. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf = (lm_coalesce_buffer_t *) s_list_peek_head(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &txq->coalesce_buf_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while(coalesce_buf)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi #define MAX_CONTIGUOUS_BLOCK (64*1024)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Allocate a small block of memory at a time. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(mem_size == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi last_coalesce_buf = coalesce_buf;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while(coalesce_buf)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size += coalesce_buf->buf_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(mem_size >= MAX_CONTIGUOUS_BLOCK) /* TBD: consider apply change here for GSO */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf = (lm_coalesce_buffer_t *) s_list_next_entry(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &coalesce_buf->link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_left -= mem_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_virt = mm_alloc_phys_mem( pdev, mem_size, &mem_phy, 0, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(ERR_IF(!mem_virt))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(mem_virt, 0, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf = last_coalesce_buf;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf->mem_virt = mem_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf->frags.frag_arr[0].addr = mem_phy;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf->frags.frag_arr[0].size = 0; /* to be set later according to actual packet size */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size -= coalesce_buf->buf_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Go to the next packet buffer. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_virt += coalesce_buf->buf_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INC64(&mem_phy, coalesce_buf->buf_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf = (lm_coalesce_buffer_t *) s_list_next_entry(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &coalesce_buf->link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(mem_left || mem_size)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("Memory allocation out of sync\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_allocate_coalesce_buffers */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_alloc_txq(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t const cid, /* chain id */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u16_t const page_cnt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u16_t const coalesce_buf_cnt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tx_chain_t *tx_chain = NULL ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t const mem_size = page_cnt * LM_PAGE_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t mm_cli_idx = 0 ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi | INFORMl2sp, "#lm_alloc_txq, cid=%d, page_cnt=%d\n", cid, page_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check arguments */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF((ARRSIZE(pdev->tx_info.chain) <= cid) || !page_cnt))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_chain = &LM_TXQ(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx = cid_to_resource(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* alloc the chain */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_chain->bd_chain.bd_chain_virt =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_alloc_phys_mem( pdev, mem_size, &tx_chain->bd_chain.bd_chain_phy, 0, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(ERR_IF(!tx_chain->bd_chain.bd_chain_virt))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(tx_chain->bd_chain.bd_chain_virt, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_chain->bd_chain.page_cnt = page_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_init(&tx_chain->active_descq, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_init(&tx_chain->coalesce_buf_list, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_chain->idx = cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_chain->coalesce_buf_cnt = coalesce_buf_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_allocate_coalesce_buffers(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &LM_TXQ(pdev, cid),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi coalesce_buf_cnt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_alloc_txq */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_alloc_rxq(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t const cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u16_t const page_cnt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t const desc_cnt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rx_chain_t* rxq_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t * bd_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rxq_chain_idx_t rx_chain_idx_max = LM_RXQ_CHAIN_IDX_MAX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rxq_chain_idx_t rx_chain_idx_cur = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t const mem_size = page_cnt * LM_PAGE_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t mm_cli_idx = 0 ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check arguments */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF((ARRSIZE(pdev->rx_info.rxq_chain) <= cid) || !page_cnt))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain = &LM_RXQ(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi, "#lm_alloc_rxq, cid=%d, page_cnt=%d, desc_cnt=%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid, page_cnt, desc_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx = cid_to_resource(pdev, cid);//!!DP mm_cli_idx_to_um_idx(LM_CHAIN_IDX_CLI(pdev, idx));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_init(&rxq_chain->common.free_descq, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_init(&rxq_chain->active_descq, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain->idx = cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain->common.desc_cnt = desc_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* alloc the chain(s) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_chain_idx_max = LM_RXQ_IS_CHAIN_SGE_VALID( pdev, cid ) ? LM_RXQ_CHAIN_IDX_SGE : LM_RXQ_CHAIN_IDX_BD;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for( rx_chain_idx_cur = 0; rx_chain_idx_cur <= rx_chain_idx_max; rx_chain_idx_cur++ )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &LM_RXQ_CHAIN( pdev, cid, rx_chain_idx_cur );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->bd_chain_virt = mm_alloc_phys_mem( pdev, mem_size, &bd_chain->bd_chain_phy, 0, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(ERR_IF(!bd_chain->bd_chain_virt))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(bd_chain->bd_chain_virt, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->page_cnt = page_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_alloc_rxq */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_alloc_rcq(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t const cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u16_t const page_cnt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rcq_chain_t *rcq_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t const mem_size = page_cnt * LM_PAGE_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t mm_cli_idx = 0 ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check arguments */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF((ARRSIZE(pdev->rx_info.rcq_chain) <= cid) || !page_cnt))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(sizeof(struct eth_rx_bd)*LM_RX_BD_CQ_SIZE_RATIO == sizeof(union eth_rx_cqe));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(sizeof(struct eth_rx_bd) == sizeof(struct eth_rx_sge) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain = &pdev->rx_info.rcq_chain[cid];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi | INFORMl2sp,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi "#lm_alloc_rcq, idx=%d, page_cnt=%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid, page_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx = cid_to_resource(pdev, cid);//!!DP mm_cli_idx_to_um_idx(LM_CHAIN_IDX_CLI(pdev, idx));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* alloc the chain */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->bd_chain.bd_chain_virt =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_alloc_phys_mem( pdev, mem_size, &rcq_chain->bd_chain.bd_chain_phy, 0, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(ERR_IF(!rcq_chain->bd_chain.bd_chain_virt))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(rcq_chain->bd_chain.bd_chain_virt, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->bd_chain.page_cnt = page_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_alloc_rcq */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Allocte TPA chain
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param cid -chain index.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param page_cnt - Number of BD pages
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param desc_cnt - Number of descriptor counts
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param bds_per_page - Number of BDs per page.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_alloc_tpa_chain(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t const cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u16_t const page_cnt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t const desc_cnt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t const bds_per_page)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tpa_chain_t* tpa_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t * bd_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tpa_sge_chain_t* sge_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mem_size = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t mm_cli_idx = 0 ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check arguments */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF((ARRSIZE(pdev->rx_info.rxq_chain) <= cid) || !page_cnt))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain = &LM_TPA(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &LM_TPA_CHAIN_BD( pdev, cid );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sge_chain = &LM_SGE_TPA_CHAIN( pdev, cid );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi, "#lm_alloc_tpa, cid=%d, page_cnt=%d, desc_cnt=%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid, page_cnt, desc_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx = cid_to_resource(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_init(&tpa_chain->common.free_descq, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->common.desc_cnt = desc_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /************ Alocate BD chain********************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = page_cnt * LM_PAGE_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->bd_chain_virt = mm_alloc_phys_mem( pdev, mem_size, &bd_chain->bd_chain_phy, 0, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(ERR_IF(!bd_chain->bd_chain_virt))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(bd_chain->bd_chain_virt, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->page_cnt = page_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // The number of SGE bd entries
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sge_chain->size = page_cnt * bds_per_page;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->state = lm_tpa_state_disable;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /************ Alocate active descriptor array********************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = LM_TPA_ACTIVE_DESCQ_ARRAY_ELEM(pdev,cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size *= sizeof(lm_packet_t *);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sge_chain->active_descq_array = mm_alloc_mem(pdev, mem_size, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(sge_chain->active_descq_array))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(sge_chain->active_descq_array, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /************ Alocate mask_array descriptor array********************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(0 != BIT_VEC64_ELEM_SZ); //LM_TPA_MASK_LEN - divide by BIT_VEC64_ELEM_SZ
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = LM_TPA_MASK_LEN(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = mem_size * sizeof(u64_t);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sge_chain->mask_array = mm_alloc_mem(pdev, mem_size, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(sge_chain->mask_array))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(sge_chain->mask_array, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /************ Alocate TPA ramrod data********************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = sizeof(struct tpa_update_ramrod_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->ramrod_data_virt = mm_alloc_phys_mem(pdev, mem_size, &tpa_chain->ramrod_data_phys, 0, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(tpa_chain->ramrod_data_virt))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(tpa_chain->ramrod_data_virt, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_alloc_tpa */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_resource_idx_t cid_to_resource(lm_device_t *pdev, u32_t cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_resource_idx_t resource;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_chain_type_not_cos != lm_mp_get_chain_type(pdev, cid))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi resource = LM_RESOURCE_NDIS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid == ISCSI_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi resource = LM_RESOURCE_ISCSI;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid == FCOE_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi resource = LM_RESOURCE_FCOE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid == FWD_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi resource = LM_RESOURCE_FWD;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid == OOO_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi resource = LM_RESOURCE_OOO;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi resource = LM_RESOURCE_COMMON;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return resource;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_setup_txq(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t * bd_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi volatile struct hc_sp_status_block * sp_sb = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t volatile * sb_indexes = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t tx_sb_index_number =0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check arguments */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF((ARRSIZE(pdev->tx_info.chain) <= cid)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_setup_txq, cid=%d\n",cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_sb = lm_get_default_status_block(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).prod_bseq = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).pkt_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).coalesce_buf_used = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).lso_split_used = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &LM_TXQ(pdev, cid).bd_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt, bd_chain->bd_chain_phy, bd_chain->page_cnt, sizeof(struct eth_tx_bd), /* is full? */0, TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi, "txq %d, bd_chain %p, bd_left %d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).bd_chain.next_bd,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).bd_chain.bd_left);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi, " bd_chain_phy 0x%x%08x\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).bd_chain.bd_chain_phy.as_u32.high,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).bd_chain.bd_chain_phy.as_u32.low);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memset(&LM_TXQ(pdev, cid).eth_tx_prods.packets_prod, 0, sizeof(eth_tx_prod_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid == FWD_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_sb->index_values[HC_SP_INDEX_ETH_FW_TX_CQ_CONS] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).hw_con_idx_ptr =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &(sp_sb->index_values[HC_SP_INDEX_ETH_FW_TX_CQ_CONS]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).hc_sb_info.hc_sb = STATUS_BLOCK_SP_SL_TYPE; // STATUS_BLOCK_SP_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).hc_sb_info.hc_index_value = HC_SP_INDEX_ETH_FW_TX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* iro_dhc_offste not initialized on purpose --> not expected for FWD channel */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid == ISCSI_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_sb->index_values[HC_SP_INDEX_ETH_ISCSI_CQ_CONS] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).hw_con_idx_ptr = &(sp_sb->index_values[HC_SP_INDEX_ETH_ISCSI_CQ_CONS]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).hc_sb_info.hc_sb = STATUS_BLOCK_SP_SL_TYPE; //STATUS_BLOCK_SP_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).hc_sb_info.hc_index_value = HC_SP_INDEX_ETH_ISCSI_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* iro_dhc_offste not initialized on purpose --> not expected for FWD channel */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid == FCOE_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_sb->index_values[HC_SP_INDEX_ETH_FCOE_CQ_CONS] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).hw_con_idx_ptr =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &(sp_sb->index_values[HC_SP_INDEX_ETH_FCOE_CQ_CONS]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).hc_sb_info.hc_sb = STATUS_BLOCK_SP_SL_TYPE; //STATUS_BLOCK_SP_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).hc_sb_info.hc_index_value = HC_SP_INDEX_ETH_FCOE_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* iro_dhc_offste not initialized on purpose --> not expected for FWD channel */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if(cid == OOO_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("OOO doesn't have a txq");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t sb_id = RSS_ID_TO_SB_ID(CHAIN_TO_RSS_ID(pdev,cid));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t byte_counter_id = CHIP_IS_E1x(pdev)? LM_FW_SB_ID(pdev, sb_id) : LM_FW_DHC_QZONE_ID(pdev, sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Assign the TX chain consumer pointer to the consumer index in the status block. TBD: rename HC_INDEX_C_ETH_TX_CQ_CONS as its inappropriate
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( sb_id >= ARRSIZE(pdev->vars.status_blocks_arr) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( sb_id >= ARRSIZE(pdev->vars.status_blocks_arr) ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_indexes = lm_get_sb_indexes(pdev, (u8_t)sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // This isn't realy cid it is the chain index
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_sb_index_number =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eth_tx_hc_cq_cons_cosx_from_chain(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_indexes[tx_sb_index_number] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).hw_con_idx_ptr = sb_indexes + tx_sb_index_number;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).hc_sb_info.hc_sb = STATUS_BLOCK_NORMAL_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).hc_sb_info.hc_index_value = tx_sb_index_number;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).hc_sb_info.iro_dhc_offset = CSTORM_BYTE_COUNTER_OFFSET(byte_counter_id, tx_sb_index_number);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "Dhc not implemented for VF yet\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_setup_txq */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_setup_rxq( IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t const cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t * bd_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rx_chain_t * rxq_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rxq_chain_idx_t rx_chain_idx_max = LM_RXQ_CHAIN_IDX_MAX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rxq_chain_idx_t rx_chain_idx_cur = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi static u8_t const eth_rx_size_arr[LM_RXQ_CHAIN_IDX_MAX] = {sizeof(struct eth_rx_bd), sizeof(struct eth_rx_sge)};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t sb_id = RSS_ID_TO_SB_ID(CHAIN_TO_RSS_ID(pdev,cid));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t byte_counter_id = CHIP_IS_E1x(pdev)? LM_FW_SB_ID(pdev, sb_id) : LM_FW_DHC_QZONE_ID(pdev, sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check arguments */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF((ARRSIZE(pdev->rx_info.rxq_chain) <= cid)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_setup_rxq, cid=%d\n",cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain = &LM_RXQ(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain->common.prod_bseq = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain->ret_bytes = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain->ret_bytes_last_fw_update = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain->common.bd_prod_without_next = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_chain_idx_max = LM_RXQ_IS_CHAIN_SGE_VALID( pdev, cid ) ? LM_RXQ_CHAIN_IDX_SGE : LM_RXQ_CHAIN_IDX_BD;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for( rx_chain_idx_cur = 0; rx_chain_idx_cur <= rx_chain_idx_max; rx_chain_idx_cur++ )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &LM_RXQ_CHAIN( pdev, cid, rx_chain_idx_cur );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt, bd_chain->bd_chain_phy,bd_chain->page_cnt, eth_rx_size_arr[rx_chain_idx_cur], /* is full? */0, TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi, "rxq[%d] bd_chain[%d] %p, bd_left %d\n", cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_chain_idx_cur,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->next_bd,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->bd_left);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi, " bd_chain_phy[%d] 0x%x%08x\n", rx_chain_idx_cur,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->bd_chain_phy.as_u32.high,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->bd_chain_phy.as_u32.low);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* We initilize the hc_sb_info here for completeness. The fw updates are actually done by rcq-chain, but the dynamic-host-coalescing based on rx-chain */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain->hc_sb_info.hc_sb = STATUS_BLOCK_NORMAL_SL_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain->hc_sb_info.hc_index_value = HC_INDEX_ETH_RX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain->hc_sb_info.iro_dhc_offset = CSTORM_BYTE_COUNTER_OFFSET(byte_counter_id, HC_INDEX_ETH_RX_CQ_CONS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain->hc_sb_info.iro_dhc_offset = sizeof(struct cstorm_queue_zone_data) * LM_FW_DHC_QZONE_ID(pdev, sb_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi + sizeof(u32_t) * HC_INDEX_ETH_RX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "Dhc offset is 0x%x for VF Q Zone %d\n",rxq_chain->hc_sb_info.iro_dhc_offset,LM_FW_DHC_QZONE_ID(pdev, sb_id));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_setup_rxq */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_setup_rcq( IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t const cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t * bd_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rcq_chain_t * rcq_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rx_chain_t * rxq_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi volatile struct hc_sp_status_block * sp_sb = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t volatile * sb_indexes = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check arguments */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF((ARRSIZE(pdev->rx_info.rcq_chain) <= cid)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain = &LM_RCQ(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain = &LM_RXQ(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_setup_rcq, cid=%d\n",cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_sb = lm_get_default_status_block(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->prod_bseq = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_IS_E1x(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->iro_prod_offset = USTORM_RX_PRODS_E1X_OFFSET(PORT_ID(pdev), LM_FW_CLI_ID(pdev, cid));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->iro_prod_offset = LM_FW_QZONE_ID(pdev, cid)*sizeof(struct ustorm_queue_zone_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "iro_prod_offset for vf = %x...\n", rcq_chain->iro_prod_offset);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //if(pdev->params.l2_rx_desc_cnt[0]) /* if removed. was not required */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &rcq_chain->bd_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt, bd_chain->bd_chain_phy,bd_chain->page_cnt, sizeof(union eth_rx_cqe), /* is full? */0, TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //number of Bds left in the RCQ must be at least the same with its corresponding Rx chain.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(lm_bd_chain_avail_bds(&rxq_chain->chain_arr[LM_RXQ_CHAIN_IDX_BD]) <= lm_bd_chain_avail_bds(&rcq_chain->bd_chain));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_RXQ_IS_CHAIN_SGE_VALID(pdev, cid ) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( !lm_bd_chains_are_consistent( &rxq_chain->chain_arr[LM_RXQ_CHAIN_IDX_BD], &rxq_chain->chain_arr[LM_RXQ_CHAIN_IDX_SGE]) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi, "rcq %d, bd_chain %p, bd_left %d\n", cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->bd_chain.next_bd,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->bd_chain.bd_left);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi, " bd_chain_phy 0x%x%08x\n", rcq_chain->bd_chain.bd_chain_phy.as_u32.high,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->bd_chain.bd_chain_phy.as_u32.low);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Assign the RCQ chain consumer pointer to the consumer index in the status block.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid == ISCSI_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_IS_E2E3(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t rel_cid = cid - LM_MAX_RSS_CHAINS(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->iro_prod_offset = USTORM_RX_PRODS_E2_OFFSET(LM_FW_AUX_QZONE_ID(pdev, rel_cid));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_sb->index_values[HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->hw_con_idx_ptr = &(sp_sb->index_values[HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->hc_sb_info.hc_sb = STATUS_BLOCK_SP_SL_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->hc_sb_info.hc_index_value = HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid == FCOE_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_IS_E2E3(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t rel_cid = cid - LM_MAX_RSS_CHAINS(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->iro_prod_offset = USTORM_RX_PRODS_E2_OFFSET(LM_FW_AUX_QZONE_ID(pdev, rel_cid));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_sb->index_values[HC_SP_INDEX_ETH_FCOE_RX_CQ_CONS] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->hw_con_idx_ptr = &(sp_sb->index_values[HC_SP_INDEX_ETH_FCOE_RX_CQ_CONS]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->hc_sb_info.hc_sb = STATUS_BLOCK_SP_SL_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->hc_sb_info.hc_index_value = HC_SP_INDEX_ETH_FCOE_RX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (cid == OOO_CID(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Any SB that isn't RSS share the same SB.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // basically we will want the ISCSI OOO to work on the same SB that ISCSI works.(This does happen see the line above)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Even if we want to count on ISCSI and make sure we will work on the same SB:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // 1.There is no promise on the order the ISCSI nminiport will call
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // ISCSI_KWQE_OPCODE_INIT1 (lm_sc_init inits pdev->iscsi_info.l5_eq_base_chain_idx) or
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // 2.OOO is general code that doesn't depend on a protocol (ISCSI).
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //TODO_OOO Ask Michal regarding E2 if we need LM_FW_SB_ID
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_IS_E2E3(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t rel_cid = cid - LM_MAX_RSS_CHAINS(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->iro_prod_offset = USTORM_RX_PRODS_E2_OFFSET(LM_FW_AUX_QZONE_ID(pdev, rel_cid));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_sb->index_values[HC_SP_INDEX_ISCSI_OOO_RX_CONS] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->hw_con_idx_ptr = &(sp_sb->index_values[HC_SP_INDEX_ISCSI_OOO_RX_CONS]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->hc_sb_info.hc_sb = STATUS_BLOCK_SP_SL_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->hc_sb_info.hc_index_value = HC_SP_INDEX_ISCSI_OOO_RX_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else /* NDIS */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t sb_id = RSS_ID_TO_SB_ID(CHAIN_TO_RSS_ID(pdev,cid));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t byte_counter_id = CHIP_IS_E1x(pdev)? LM_FW_SB_ID(pdev, sb_id) : LM_FW_DHC_QZONE_ID(pdev, sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev) && CHIP_IS_E2E3(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->iro_prod_offset = USTORM_RX_PRODS_E2_OFFSET(LM_FW_DHC_QZONE_ID(pdev, sb_id));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( sb_id >= ARRSIZE(pdev->vars.status_blocks_arr) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( sb_id >= ARRSIZE(pdev->vars.status_blocks_arr) ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_indexes = lm_get_sb_indexes(pdev, (u8_t)sb_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sb_indexes[HC_INDEX_ETH_RX_CQ_CONS] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->hw_con_idx_ptr = sb_indexes + HC_INDEX_ETH_RX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->hc_sb_info.hc_sb = STATUS_BLOCK_NORMAL_SL_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->hc_sb_info.hc_index_value = HC_INDEX_ETH_RX_CQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rcq_chain->hc_sb_info.iro_dhc_offset = CSTORM_BYTE_COUNTER_OFFSET(byte_counter_id, HC_INDEX_ETH_RX_CQ_CONS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "Dhc not implemented for VF yet\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_setup_rcq */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_setup_client_con_resc(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t cid
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if((GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_RX) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (cid >= MAX_RX_CHAIN(pdev))) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TX) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (cid >= MAX_TX_CHAIN(pdev))))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg(" invalid chain ");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_setup_txq(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_RX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_setup_rxq(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_setup_rcq(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TPA))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_setup_tpa_chain(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[cid].last_set_rx_mask = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * reset txq, rxq, rcq counters for L2 client connection
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * assumption: the cid equals the chain idx
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_clear_eth_con_resc( IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u8_t const cid )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t sb_id = lm_sb_id_from_chain(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t max_eth_cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
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 {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Set hw consumer index pointers to null, so we won't get rx/tx completion */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* for this connection, next time we'll load it */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Regardless the attributes we "clean' the TX status block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid >= MAX_TX_CHAIN(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg(" Invalid TX chain index ");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* first set the hw consumer index pointers to null, and only then clear the pkt_idx value
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * to avoid a race when servicing interrupt at the same time */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_clear_chain_sb_cons_idx(pdev, sb_id, &LM_TXQ(pdev, cid).hc_sb_info, &LM_TXQ(pdev, cid).hw_con_idx_ptr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TXQ(pdev, cid).pkt_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_RX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid >= MAX_RX_CHAIN(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg(" Invalid RX chain index ");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_clear_chain_sb_cons_idx(pdev, sb_id, &LM_RCQ(pdev, cid).hc_sb_info, &LM_RCQ(pdev, cid).hw_con_idx_ptr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //s_list_init(&LM_RXQ(pdev, cid).active_descq, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //s_list_init(&LM_RXQ(pdev, cid).free_descq, NULL, NULL, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_alloc_chain_con_resc(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t const cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_cli_idx_t const lm_cli_idx
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t l2_rx_bd_page_cnt = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t l2_tpa_bd_page_cnt = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t bds_per_page = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if((GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_RX) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (cid >= MAX_RX_CHAIN(pdev))) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TX) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (cid >= MAX_TX_CHAIN(pdev))))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg(" invalid chain ");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_alloc_txq(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (u16_t)pdev->params.l2_tx_bd_page_cnt[lm_cli_idx],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (u16_t)pdev->params.l2_tx_coal_buf_cnt[lm_cli_idx]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_RX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l2_rx_bd_page_cnt =_ceil( pdev->params.l2_cli_con_params[cid].num_rx_desc, 500 );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_alloc_rxq(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l2_rx_bd_page_cnt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.l2_cli_con_params[cid].num_rx_desc);
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_alloc_rcq(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (u16_t)l2_rx_bd_page_cnt * LM_RX_BD_CQ_SIZE_RATIO);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(GET_FLAGS(pdev->params.l2_cli_con_params[cid].attributes,LM_CLIENT_ATTRIBUTES_TPA))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bds_per_page = BD_PER_PAGE(LM_TPA_BD_ELEN_SIZE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((0 == pdev->params.tpa_desc_cnt_per_chain) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (!(POWER_OF_2(bds_per_page))))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg(" Illegal TPA params");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l2_tpa_bd_page_cnt =_ceil( pdev->params.tpa_desc_cnt_per_chain,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi USABLE_BDS_PER_PAGE(LM_TPA_BD_ELEN_SIZE, TRUE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l2_tpa_bd_page_cnt = (u16_t)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi upper_align_power_of_2(l2_tpa_bd_page_cnt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sizeof(l2_tpa_bd_page_cnt) * BITS_PER_BYTE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_alloc_tpa_chain(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi l2_tpa_bd_page_cnt,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.tpa_desc_cnt_per_chain,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bds_per_page);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_setup_client_con_params( IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u8_t const chain_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_client_con_params_t *cli_params )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rx_chain_t* rxq_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CHK_NULL(cli_params) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF((ARRSIZE(pdev->params.l2_cli_con_params) <= chain_idx) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (CHIP_IS_E1H(pdev) && (chain_idx >= ETH_MAX_RX_CLIENTS_E1H)) || /* TODO E2 add IS_E2*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (CHIP_IS_E1(pdev) && (chain_idx >= ETH_MAX_RX_CLIENTS_E1)) ))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(&pdev->params.l2_cli_con_params[chain_idx], cli_params, sizeof(struct _lm_client_con_params_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(GET_FLAGS(pdev->params.l2_cli_con_params[chain_idx].attributes,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_CLIENT_ATTRIBUTES_RX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // update rxq_chain strucutre
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain = &LM_RXQ(pdev, chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain->lah_size = pdev->params.l2_cli_con_params[chain_idx].lah_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_init_chain_con( IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u8_t const chain_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u8_t const b_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t lm_cli_idx = LM_CHAIN_IDX_CLI(pdev, chain_idx); // FIXME!!!
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (LM_CLI_IDX_MAX <= lm_cli_idx))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg(" lm_init_client_con lm_cli_idx has an invalid value");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (b_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_alloc_chain_con_resc(pdev, chain_idx, lm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(GET_FLAGS(pdev->params.l2_cli_con_params[chain_idx].attributes,LM_CLIENT_ATTRIBUTES_RX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* On allocation, init the clients objects... do this only on allocation, on setup, we'll need
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the info to reconfigure... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_mac_obj(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->client_info[chain_idx].mac_obj,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_FW_CLI_ID(pdev, chain_idx),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi chain_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FUNC_ID(pdev),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH(pdev, mac_rdata)[lm_cli_idx],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH_PHYS(pdev, mac_rdata)[lm_cli_idx],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_FILTER_MAC_PENDING,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (unsigned long *)&pdev->client_info[chain_idx].sp_mac_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_OBJ_TYPE_RX_TX,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->slowpath_info.macs_pool);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CHIP_IS_E1(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_vlan_mac_obj(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->client_info[chain_idx].mac_vlan_obj,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_FW_CLI_ID(pdev, chain_idx),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi chain_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FUNC_ID(pdev),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH(pdev, mac_rdata)[lm_cli_idx],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH_PHYS(pdev, mac_rdata)[lm_cli_idx],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_FILTER_VLAN_MAC_PENDING,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (unsigned long *)&pdev->client_info[chain_idx].sp_mac_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_OBJ_TYPE_RX_TX,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->slowpath_info.macs_pool,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->slowpath_info.vlans_pool);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CHIP_IS_E1x(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_vlan_obj(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->client_info[chain_idx].vlan_obj,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_FW_CLI_ID(pdev, chain_idx),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi chain_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FUNC_ID(pdev),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH(pdev, mac_rdata)[lm_cli_idx],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH_PHYS(pdev, mac_rdata)[lm_cli_idx],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_FILTER_VLAN_PENDING,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (unsigned long *)&pdev->client_info[chain_idx].sp_mac_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_OBJ_TYPE_RX_TX,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->slowpath_info.vlans_pool);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_setup_client_con_resc(pdev, chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_alloc_sq(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_info_t * sq_info = &pdev->sq_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sq_info->sq_chain.sq_chain_virt = mm_alloc_phys_mem( pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_PAGE_SIZE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (lm_address_t*)&(sq_info->sq_chain.bd_chain_phy),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_CLI_IDX_MAX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(sq_info->sq_chain.sq_chain_virt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(sq_info->sq_chain.sq_chain_virt, LM_PAGE_SIZE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_alloc_eq(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_chain_t *eq_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mem_size = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t const page_cnt = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check arguments */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi | INFORMl2sp, "#lm_alloc_eq\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = page_cnt * LM_PAGE_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi eq_chain = &pdev->eq_info.eq_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* alloc the chain */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi eq_chain->bd_chain.bd_chain_virt =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_alloc_phys_mem( pdev, mem_size, &eq_chain->bd_chain.bd_chain_phy, 0, LM_CLI_IDX_MAX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(ERR_IF(!eq_chain->bd_chain.bd_chain_virt))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(eq_chain->bd_chain.bd_chain_virt, mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi eq_chain->bd_chain.page_cnt = page_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_alloc_client_info(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_t *client_init_data_virt = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u32_t mem_size_init = sizeof(client_init_data_t);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct client_update_ramrod_data *client_update_data_virt = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u32_t mem_size_update = sizeof(struct client_update_ramrod_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < ARRSIZE(pdev->client_info); i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //Init data
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt = mm_alloc_phys_mem(pdev, mem_size_init, &pdev->client_info[i].client_init_data_phys, 0, LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(client_init_data_virt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(client_init_data_virt, mem_size_init);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[i].client_init_data_virt = client_init_data_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //update data
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt = mm_alloc_phys_mem(pdev, mem_size_update, &pdev->client_info[i].update.data_phys, 0, LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(client_update_data_virt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(client_update_data_virt, mem_size_update);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[i].update.data_virt = client_update_data_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_setup_client_info(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_t *client_init_data_virt = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u32_t mem_size_init = sizeof(client_init_data_t);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct client_update_ramrod_data *client_update_data_virt = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u32_t mem_size_update = sizeof(struct client_update_ramrod_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < ARRSIZE(pdev->client_info); i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //Init
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt = pdev->client_info[i].client_init_data_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(client_init_data_virt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "client-init-data at this point is not expected to be null... \n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(client_init_data_virt, mem_size_init);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //update
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt = pdev->client_info[i].update.data_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(client_update_data_virt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "client-update-data at this point is not expected to be null... \n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(client_update_data_virt, mem_size_update);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The next page entrys are static and wont be used by active
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * descriptor array and mask array.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param chain_idx
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return STATIC void
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi__inline STATIC void
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_tpa_clear_next_page( IN lm_device_t* pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u32_t chain_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t* bd_chain = &LM_TPA_CHAIN_BD(pdev, chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t active_entry = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t bd_entry = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t j = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(i = 1; i <= lm_bd_chain_page_cnt(bd_chain); i++ )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_entry = (lm_bd_chain_bds_per_page(bd_chain) * i) - lm_bd_chain_bds_skip_eop(bd_chain);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* clear page-end entries */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(j = 0; j < lm_bd_chain_bds_skip_eop(bd_chain); j++ )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi active_entry = LM_TPA_BD_ENTRY_TO_ACTIVE_ENTRY(pdev, chain_idx, bd_entry);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TPA_MASK_CLEAR_ACTIVE_BIT(pdev, chain_idx, active_entry);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_entry++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Clear TPA parameters. TPA can be disabled between NDIS bind
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * unbind but the RX cahin will stay used.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param cid
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_tpa_chain_reset(IN lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u32_t cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tpa_chain_t * tpa_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check arguments */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF((ARRSIZE(pdev->rx_info.rxq_chain) <= cid)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_setup_tpa, cid=%d\n",cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain = &LM_TPA(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /***************** SGE chain setup *************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(tpa_chain,sizeof(lm_tpa_chain_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param cid
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_setup_tpa_chain( IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u32_t const cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t * bd_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tpa_chain_t * tpa_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check arguments */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pdev) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ERR_IF((ARRSIZE(pdev->rx_info.rxq_chain) <= cid)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi|INFORMl2sp, "#lm_setup_tpa, cid=%d\n",cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain = &LM_TPA(pdev, cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &LM_TPA_CHAIN_BD( pdev, cid );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /***************** TPA chain setup ************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(i = 0; i < ARRSIZE(tpa_chain->start_coales_bd) ; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->start_coales_bd[i].is_entry_used = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->start_coales_bd[i].packet = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /***************** SGE common setup ************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->common.prod_bseq = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->common.bd_prod_without_next = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /***************** SGE chain setup *************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt, bd_chain->bd_chain_phy,bd_chain->page_cnt, LM_TPA_BD_ELEN_SIZE, /* is full? */0, TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi, "rxq[%d] bd_chain[%d] %p, bd_left %d\n", cid,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->next_bd,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->bd_left);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi, " bd_chain_phy[%d] 0x%x%08x\n", bd_chain->bd_chain_phy.as_u32.high,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain->bd_chain_phy.as_u32.low);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->sge_chain.last_max_con = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(i = 0; i < LM_TPA_ACTIVE_DESCQ_ARRAY_ELEM(pdev, cid) ; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->sge_chain.active_descq_array[i] = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /***************** Mask entry prepare *************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(0 != BIT_VEC64_ELEM_SZ); //LM_TPA_MASK_LEN - divide by BIT_VEC64_ELEM_SZ
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(i = 0; i < LM_TPA_MASK_LEN(pdev, cid) ; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->sge_chain.mask_array[i] = BIT_VEC64_ELEM_ONE_MASK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tpa_clear_next_page(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_setup_tpa */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_setup_sq(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_info_t * sq_info = &pdev->sq_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(sq_info->sq_chain.sq_chain_virt, LM_PAGE_SIZE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.num_pending_normal = MAX_NORMAL_PRIORITY_SPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.num_pending_high = MAX_HIGH_PRIORITY_SPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_init(&pdev->sq_info.pending_normal, 0,0,0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_init(&pdev->sq_info.pending_high, 0,0,0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi d_list_init(&pdev->sq_info.pending_complete, 0,0,0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* The spq dont have next bd */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.sq_chain.bd_left = USABLE_BDS_PER_PAGE(sizeof(struct slow_path_element), TRUE); /* prod == cons means empty chain */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.sq_chain.con_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.sq_chain.prod_bd = pdev->sq_info.sq_chain.sq_chain_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.sq_chain.last_bd = pdev->sq_info.sq_chain.prod_bd + pdev->sq_info.sq_chain.bd_left ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->sq_info.sq_chain.prod_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_setup_eq(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t * bd_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_eq_chain_t * eq_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi volatile struct hc_sp_status_block * sp_sb = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* check arguments */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(CHK_NULL(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMeq, "#lm_setup_eq\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi eq_chain = &pdev->eq_info.eq_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi bd_chain = &eq_chain->bd_chain;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_setup(pdev, bd_chain, bd_chain->bd_chain_virt, bd_chain->bd_chain_phy, bd_chain->page_cnt, sizeof(union event_ring_elem), /* is full? */TRUE, TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_sb = lm_get_default_status_block(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_sb->index_values[HC_SP_INDEX_EQ_CONS] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi eq_chain->hw_con_idx_ptr = &sp_sb->index_values[HC_SP_INDEX_EQ_CONS];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi eq_chain->hc_sb_info.hc_sb = STATUS_BLOCK_NORMAL_SL_TYPE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi eq_chain->hc_sb_info.hc_index_value = HC_SP_INDEX_EQ_CONS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi eq_chain->iro_prod_offset = CSTORM_EVENT_RING_PROD_OFFSET(FUNC_ID(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_init_sp_objs(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t lm_cli_idx = LM_CLI_IDX_MAX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_mac_credit_pool(pdev, &pdev->slowpath_info.macs_pool, FUNC_ID(pdev), CHIP_IS_E1x(pdev)? VNICS_PER_PORT(pdev) : VNICS_PER_PATH(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_vlan_credit_pool(pdev, &pdev->slowpath_info.vlans_pool, FUNC_ID(pdev), CHIP_IS_E1x(pdev)? VNICS_PER_PORT(pdev) : VNICS_PER_PATH(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_rx_mode_obj(pdev, &pdev->slowpath_info.rx_mode_obj);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (lm_cli_idx=0; lm_cli_idx < ARRSIZE(pdev->slowpath_info.mcast_obj); lm_cli_idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_mcast_obj(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->slowpath_info.mcast_obj[lm_cli_idx],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_FW_CLI_ID(pdev, pdev->params.map_client_to_cid[lm_cli_idx]),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.map_client_to_cid[lm_cli_idx],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FUNC_ID(pdev),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FUNC_ID(pdev),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH(pdev, mcast_rdata)[lm_cli_idx],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH_PHYS(pdev, mcast_rdata)[lm_cli_idx],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_FILTER_MCAST_PENDING,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (unsigned long *)&pdev->slowpath_info.sp_mcast_state[lm_cli_idx],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_OBJ_TYPE_RX_TX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_rss_config_obj(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->slowpath_info.rss_conf_obj,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_FW_CLI_ID(pdev, LM_SW_LEADING_RSS_CID(pdev)),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SW_LEADING_RSS_CID(pdev),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FUNC_ID(pdev),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FUNC_ID(pdev),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH(pdev, rss_rdata),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH_PHYS(pdev, rss_rdata),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_FILTER_RSS_CONF_PENDING,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (unsigned long *)&pdev->slowpath_info.sp_rss_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_OBJ_TYPE_RX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * allocate slowpath resources
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_alloc_setup_slowpath_resc(struct _lm_device_t *pdev , u8_t b_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_slowpath_data_t *slowpath_data = &pdev->slowpath_info.slowpath_data;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(ARRSIZE(slowpath_data->mac_rdata) == ARRSIZE(slowpath_data->rx_mode_rdata));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC(ARRSIZE(slowpath_data->mac_rdata) == ARRSIZE(slowpath_data->mcast_rdata));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0; i < ARRSIZE(slowpath_data->mac_rdata); i++ )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (b_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi slowpath_data->mac_rdata[i] =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_alloc_phys_mem(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sizeof(*slowpath_data->mac_rdata[i]),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &slowpath_data->mac_rdata_phys[i],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi slowpath_data->rx_mode_rdata[i] =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_alloc_phys_mem(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sizeof(*slowpath_data->rx_mode_rdata[i]),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &slowpath_data->rx_mode_rdata_phys[i],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi slowpath_data->mcast_rdata[i] =
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_alloc_phys_mem(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sizeof(*slowpath_data->mcast_rdata[i]),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &slowpath_data->mcast_rdata_phys[i],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHK_NULL(slowpath_data->mac_rdata[i]) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CHK_NULL(slowpath_data->rx_mode_rdata[i]) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CHK_NULL(slowpath_data->mcast_rdata[i]))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(slowpath_data->mac_rdata[i], sizeof(*slowpath_data->mac_rdata[i]));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(slowpath_data->rx_mode_rdata[i], sizeof(*slowpath_data->rx_mode_rdata[i]));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(slowpath_data->mcast_rdata[i], sizeof(*slowpath_data->mcast_rdata[i]));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (b_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi slowpath_data->rss_rdata = mm_alloc_phys_mem(pdev, sizeof(*slowpath_data->rss_rdata), &slowpath_data->rss_rdata_phys, 0, LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(slowpath_data->rss_rdata)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(slowpath_data->rss_rdata, sizeof(*slowpath_data->rss_rdata));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (b_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi slowpath_data->func_start_data = mm_alloc_phys_mem(pdev, sizeof(*slowpath_data->func_start_data), &slowpath_data->func_start_data_phys, 0, LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(slowpath_data->func_start_data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(slowpath_data->func_start_data, sizeof(*slowpath_data->func_start_data));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (b_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi slowpath_data->niv_function_update_data = mm_alloc_phys_mem(pdev, sizeof(*slowpath_data->niv_function_update_data), &slowpath_data->niv_function_update_data_phys, 0, LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(slowpath_data->niv_function_update_data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(slowpath_data->niv_function_update_data, sizeof(*slowpath_data->niv_function_update_data));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (b_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi slowpath_data->l2mp_func_update_data = mm_alloc_phys_mem(pdev, sizeof(*slowpath_data->l2mp_func_update_data), &slowpath_data->l2mp_func_update_data_phys, 0, LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(slowpath_data->l2mp_func_update_data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(slowpath_data->l2mp_func_update_data, sizeof(*slowpath_data->l2mp_func_update_data));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (b_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi slowpath_data->encap_function_update_data = mm_alloc_phys_mem(pdev, sizeof(*slowpath_data->encap_function_update_data), &slowpath_data->encap_function_update_data_phys, 0, LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(slowpath_data->encap_function_update_data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(slowpath_data->encap_function_update_data, sizeof(*slowpath_data->encap_function_update_data));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (b_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi slowpath_data->ufp_function_update_data = mm_alloc_phys_mem(pdev, sizeof(*slowpath_data->ufp_function_update_data), &slowpath_data->ufp_function_update_data_phys, 0, LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(slowpath_data->ufp_function_update_data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(slowpath_data->ufp_function_update_data, sizeof(*slowpath_data->ufp_function_update_data));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.niv_ramrod_state = NIV_RAMROD_NOT_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.l2mp_func_update_ramrod_state = L2MP_FUNC_UPDATE_RAMROD_NOT_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->slowpath_info.ufp_func_ramrod_state = UFP_RAMROD_NOT_POSTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void * lm_setup_allocate_ilt_client_page( struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t *phys_mem,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t const cli_idx )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void* ilt_client_page_virt_address = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CHIP_IS_E1(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ilt_client_page_virt_address = mm_alloc_phys_mem_align( pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.ilt_client_page_size,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phys_mem,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_ILT_ALIGNMENT,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ilt_client_page_virt_address = mm_alloc_phys_mem_align(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.ilt_client_page_size,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phys_mem,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.ilt_client_page_size,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ilt_client_page_virt_address;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* This routine contain common code for alloc/setup distinguish by flag
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_common_setup_alloc_resc(struct _lm_device_t *pdev, u8_t const b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_params_t* params = NULL ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_variables_t* vars = NULL ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// lm_sq_info_t* sq_info = NULL ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t alloc_size = 0 ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t alloc_num = 0 ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t i = 0 ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t mem_size = 0 ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t sb_id = 0 ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t mm_cli_idx = 0 ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t sb_phy_address;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL( pdev )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi , "### lm_common_setup_alloc_resc b_is_alloc=%s\n", b_is_alloc ? "TRUE" : "FALSE" );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi params = &pdev->params ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars = &(pdev->vars) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Status blocks allocation. We allocate mem both for the default and non-default status blocks
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // there is 1 def sb and 16 non-def sb per port.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // non-default sb: index 0-15, default sb: index 16.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_IS_E1x(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = E1X_STATUS_BLOCK_BUFFER_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = E2_STATUS_BLOCK_BUFFER_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx = LM_RESOURCE_COMMON;//!!DP mm_cli_idx_to_um_idx(LM_CLI_IDX_MAX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_FOREACH_SB_ID(pdev, sb_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->status_blocks_arr[sb_id].host_hc_status_block.e1x_sb = mm_alloc_phys_mem(pdev, mem_size, &sb_phy_address, 0, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_IS_E1x(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->status_blocks_arr[sb_id].hc_status_block_data.e1x_sb_data.common.host_sb_addr.lo = sb_phy_address.as_u32.low;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->status_blocks_arr[sb_id].hc_status_block_data.e1x_sb_data.common.host_sb_addr.hi = sb_phy_address.as_u32.high;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->status_blocks_arr[sb_id].hc_status_block_data.e2_sb_data.common.host_sb_addr.lo = sb_phy_address.as_u32.low;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->status_blocks_arr[sb_id].hc_status_block_data.e2_sb_data.common.host_sb_addr.hi = sb_phy_address.as_u32.high;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(vars->status_blocks_arr[sb_id].host_hc_status_block.e1x_sb)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero((void *)(vars->status_blocks_arr[sb_id].host_hc_status_block.e1x_sb), mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = DEF_STATUS_BLOCK_BUFFER_SIZE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->gen_sp_status_block.hc_sp_status_blk = mm_alloc_phys_mem(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &(vars->gen_sp_status_block.blk_phy_address),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(vars->gen_sp_status_block.hc_sp_status_blk)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero((void *)(vars->gen_sp_status_block.hc_sp_status_blk), mem_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Now reset the status-block ack values back to zero. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_reset_sb_ack_values(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(pdev->debug_info.ack_dis, sizeof(pdev->debug_info.ack_dis));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(pdev->debug_info.ack_en, sizeof(pdev->debug_info.ack_en));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->debug_info.ack_def_dis = pdev->debug_info.ack_def_en = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(pdev->debug_info.rx_only_int, sizeof(pdev->debug_info.rx_only_int));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(pdev->debug_info.tx_only_int, sizeof(pdev->debug_info.tx_only_int));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(pdev->debug_info.both_int, sizeof(pdev->debug_info.both_int));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(pdev->debug_info.empty_int, sizeof(pdev->debug_info.empty_int));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(pdev->debug_info.false_int, sizeof(pdev->debug_info.false_int));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Register common and ethernet connection types completion callback. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_comp_cb_register(pdev, ETH_CONNECTION_TYPE, lm_eth_comp_cb);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_sq_comp_cb_register(pdev, NONE_CONNECTION_TYPE, lm_eq_comp_cb);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* SlowPath Info */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_alloc_setup_slowpath_resc(pdev, b_is_alloc);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_alloc_client_info failed lm-status = %d\n", lm_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Client Info */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_alloc_client_info(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_alloc_client_info failed lm-status = %d\n", lm_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_setup_client_info(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_setup_client_info failed lm-status = %d\n", lm_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Context (roundup ( MAX_CONN / CONN_PER_PAGE) We may configure the CDU to have more than max_func_connections, specifically, we will
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // configure the CDU to have max_port_connections since it is a per-port register and not per-func, but it is OK to allocate
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // less for the cdu, and allocate only what will be used in practice - which is what is configured in max_func_connectinos.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi alloc_num = vars->context_cdu_num_pages = (params->max_func_connections / params->num_context_in_page) +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ((params->max_func_connections % params->num_context_in_page)? 1:0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //TODO: optimize the roundup
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //TODO: assert that we did not go over the limit
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // allocate buffer pointers
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = alloc_num * sizeof(void *) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->context_cdu_virt_addr_table = (void **) mm_alloc_mem( pdev, mem_size, mm_cli_idx );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL( vars->context_cdu_virt_addr_table )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if ( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->context_cdu_virt_addr_table, mem_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = alloc_num * sizeof(lm_address_t) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->context_cdu_phys_addr_table = mm_alloc_mem(pdev, mem_size, mm_cli_idx );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL( vars->context_cdu_phys_addr_table )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if ( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(vars->context_cdu_phys_addr_table, mem_size );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TBD: for starters, we'll just allocate each page seperatly, to save space in the future, we may want */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for( i = 0 ;i < alloc_num; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->context_cdu_virt_addr_table[i] = lm_setup_allocate_ilt_client_page(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (lm_address_t*)&vars->context_cdu_phys_addr_table[i],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL( vars->context_cdu_virt_addr_table[i] )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->context_cdu_virt_addr_table[i], params->ilt_client_page_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Searcher T1 (roundup to log2 of 64*MAX_CONN), T2 is 1/4 of T1. The searcher has a 'per-function' register we configure
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // with the number of max connections, therefore, we use the max_func_connections. It can be different per function and independent
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // from what we configure for qm/timers/cdu.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi alloc_size = (log2_align(max(params->max_func_connections,(u32_t)1000))*64);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi alloc_num = vars->searcher_t1_num_pages = max((alloc_size / params->ilt_client_page_size),(u32_t)1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = alloc_num * sizeof(void *) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->searcher_t1_virt_addr_table = (void **) mm_alloc_mem(pdev, mem_size, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(vars->searcher_t1_virt_addr_table)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if ( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->searcher_t1_virt_addr_table, mem_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = alloc_num * sizeof(lm_address_t) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->searcher_t1_phys_addr_table = mm_alloc_mem(pdev, mem_size, mm_cli_idx );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(vars->searcher_t1_phys_addr_table)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if ( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->searcher_t1_phys_addr_table, mem_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for( i = 0 ; i < alloc_num; i++ )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->searcher_t1_virt_addr_table[i] = lm_setup_allocate_ilt_client_page(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (lm_address_t*)&(vars->searcher_t1_phys_addr_table[i]),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL( vars->searcher_t1_virt_addr_table[i] )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->searcher_t1_virt_addr_table[i], params->ilt_client_page_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // allocate searcher T2 table
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // T2 does not entered into the ILT)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi alloc_size = (params->max_func_connections + 4)*64;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi alloc_num = vars->searcher_t2_num_pages = alloc_size / params->ilt_client_page_size +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ((alloc_size % params->ilt_client_page_size)? 1:0) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = alloc_num * sizeof(void *) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->searcher_t2_virt_addr_table = (void **) mm_alloc_mem(pdev, mem_size, mm_cli_idx) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(vars->searcher_t2_virt_addr_table)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (b_is_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->searcher_t2_virt_addr_table, mem_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = alloc_num * sizeof(lm_address_t) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (b_is_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->searcher_t2_phys_addr_table = mm_alloc_mem(pdev, mem_size, mm_cli_idx );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(vars->searcher_t2_phys_addr_table)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for( i = 0 ; i < alloc_num; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->searcher_t2_virt_addr_table[i] = lm_setup_allocate_ilt_client_page(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (lm_address_t*)&(vars->searcher_t2_phys_addr_table[i]),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(vars->searcher_t2_virt_addr_table[i])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->searcher_t2_virt_addr_table[i],params->ilt_client_page_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Timer block array (MAX_CONN*8) phys uncached. Timer block has a per-port register that defines it's size, and the amount of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // memory we allocate MUST match this number, therefore we have to allocate the amount of max_port_connections.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi alloc_size = ( 8 * pdev->hw_info.max_port_conns);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi alloc_num = vars->timers_linear_num_pages = alloc_size / params->ilt_client_page_size +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ((alloc_size % params->ilt_client_page_size)? 1:0) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = alloc_num * sizeof(void *) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->timers_linear_virt_addr_table = (void **) mm_alloc_mem(pdev, mem_size, mm_cli_idx );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(vars->timers_linear_virt_addr_table)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if ( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->timers_linear_virt_addr_table, mem_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = alloc_num * sizeof(lm_address_t) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->timers_linear_phys_addr_table = mm_alloc_mem(pdev, mem_size, mm_cli_idx );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(vars->timers_linear_phys_addr_table)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if ( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->timers_linear_phys_addr_table, mem_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for( i = 0 ;i < alloc_num; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->timers_linear_virt_addr_table[i] = lm_setup_allocate_ilt_client_page(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (lm_address_t*)&(vars->timers_linear_phys_addr_table[i]),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(vars->timers_linear_virt_addr_table[i])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->timers_linear_virt_addr_table[i], params->ilt_client_page_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // QM queues (128*MAX_CONN) QM has a per-port register that defines it's size, and the amount of
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // memory we allocate MUST match this number, therefore we have to allocate the amount of max_port_connections.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi alloc_size = ( 128 * pdev->hw_info.max_common_conns);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi alloc_num = vars->qm_queues_num_pages = alloc_size / params->ilt_client_page_size +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ((alloc_size % params->ilt_client_page_size)? 1:0) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = alloc_num * sizeof(void *) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->qm_queues_virt_addr_table = (void **) mm_alloc_mem(pdev, mem_size, mm_cli_idx );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(vars->qm_queues_virt_addr_table)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (b_is_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->qm_queues_virt_addr_table, mem_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_size = alloc_num * sizeof(lm_address_t) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->qm_queues_phys_addr_table = mm_alloc_mem(pdev, mem_size, mm_cli_idx );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(vars->qm_queues_phys_addr_table)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (b_is_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->qm_queues_phys_addr_table, mem_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for( i=0 ;i < alloc_num; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (b_is_alloc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars->qm_queues_virt_addr_table[i] = lm_setup_allocate_ilt_client_page(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (lm_address_t*)&(vars->qm_queues_phys_addr_table[i]),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL( vars->qm_queues_virt_addr_table[i] )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->qm_queues_virt_addr_table[i],params->ilt_client_page_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // common scratchpad buffer for dmae copies of less than 4 bytes
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_is_alloc )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi void *virt = mm_alloc_phys_mem(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 8,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &params->dmae_copy_scratchpad_phys,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(virt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t ecore_resc_alloc(struct _lm_device_t * pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->ecore_info.gunzip_buf = mm_alloc_phys_mem(pdev, FW_BUF_SIZE, &pdev->ecore_info.gunzip_phys, PHYS_MEM_TYPE_NONCACHED, LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(pdev->ecore_info.gunzip_buf)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**lm_dmae_resc_alloc
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Allocate and initialize the TOE and default DMAE contexts.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * The statistics DMAE context is set-up in lm_stats_alloc_resc.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev the device to use.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t LM_STATUS_SUCCESS on success, some other
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * failure code on failure.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic lm_status_t lm_dmae_alloc_resc(struct _lm_device_t * pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_context_info_t* default_dmae_info = lm_dmae_get(pdev, LM_DMAE_DEFAULT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_dmae_context_info_t* toe_dmae_info = lm_dmae_get(pdev, LM_DMAE_TOE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //allocate and initialize the default DMAE context (used for init, WB access etc...)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_dmae_locking_policy_create( pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_PROTECTED_RESOURCE_DMAE_DEFAULT,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_LOCKING_POLICY_TYPE_PER_PF,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &default_dmae_info->locking_policy);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_STATUS_SUCCESS != lm_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default_dmae_info->context = lm_dmae_context_create(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DMAE_WB_ACCESS_FUNCTION_CMD(FUNC_ID(pdev)),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &default_dmae_info->locking_policy,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CHANGE_ENDIANITY);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( NULL == default_dmae_info->context )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //allocate and initialize the TOE DMAE context
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_dmae_locking_policy_create( pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_PROTECTED_RESOURCE_DMAE_TOE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_DMAE_LOCKING_POLICY_TYPE_INTER_PF,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &toe_dmae_info->locking_policy);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_STATUS_SUCCESS != lm_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi toe_dmae_info->context = lm_dmae_context_create(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DMAE_COPY_PCI_PCI_PORT_0_CMD + PORT_ID(pdev),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &toe_dmae_info->locking_policy,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( NULL == toe_dmae_info->context )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* This routine is called during driver initialization. It is responsible
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* for allocating memory resources needed by the driver for common init.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* This routine calls the following mm routines:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* mm_alloc_mem, mm_alloc_phys_mem, and mm_init_packet_desc. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_alloc_resc(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_params_t* params = NULL ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_variables_t* vars = NULL ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t mm_cli_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL( pdev )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi , "### lm_alloc_resc\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_VFDEV(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_vf_init_dev_info(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi params = &pdev->params ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars = &(pdev->vars) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx = LM_CLI_IDX_MAX;//!!DP mm_cli_idx_to_um_idx(LM_CLI_IDX_MAX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Cleaning after driver unload
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->context_info = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(&pdev->cid_recycled_callbacks, sizeof(pdev->cid_recycled_callbacks));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(&pdev->toe_info, sizeof(pdev->toe_info));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_alloc_sq(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* alloc forward chain */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->tx_info.catchup_chain_idx = FWD_CID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Allocate Event-Queue: only the pf has an event queue */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_alloc_eq(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->tx_info.catchup_chain_idx = FWD_CID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_alloc_txq(pdev, pdev->tx_info.catchup_chain_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (u16_t)params->l2_tx_bd_page_cnt[LM_CLI_IDX_FWD],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (u16_t)params->l2_tx_coal_buf_cnt[LM_CLI_IDX_FWD]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_common_setup_alloc_resc(pdev, TRUE ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_vf_setup_alloc_resc(pdev, TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_stats_alloc_resc( pdev ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_STATUS_SUCCESS != lm_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_dmae_alloc_resc(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_STATUS_SUCCESS != lm_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Init context allocation system
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_alloc_context_pool(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_STATUS_SUCCESS != lm_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // CAM mirror?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* alloc for ecore */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = ecore_resc_alloc(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_STATUS_SUCCESS != lm_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (IS_CHANNEL_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Init context allocation system
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_alloc_context_pool(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_STATUS_SUCCESS != lm_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_stats_alloc_fw_resc(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_STATUS_SUCCESS != lm_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORMi , "### exit lm_alloc_resc\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* FIXME: (MichalS : should be called by um, but this requires lm-um api, so should rethink...) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_init_sp_objs(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_STATUS_SUCCESS != lm_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( LM_STATUS_SUCCESS != lm_status ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_setup_resc(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* This routine is called during driver initialization. It is responsible
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* for initilazing memory resources needed by the driver for common init.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* This routine calls the following mm routines:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* mm_alloc_mem, mm_alloc_phys_mem, and mm_init_packet_desc. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_setup_resc(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi volatile struct hc_sp_status_block * sp_sb = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_params_t * params = NULL ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_variables_t* vars = NULL ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tx_info_t * tx_info = NULL ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rx_info_t * rx_info = NULL ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t i = 0 ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t j = 0 ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL( pdev )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi params = &pdev->params;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vars = &(pdev->vars);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_info = &pdev->tx_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_info = &pdev->rx_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sp_sb = lm_get_default_status_block(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(&pdev->cid_recycled_callbacks, sizeof(pdev->cid_recycled_callbacks));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(rx_info->appr_mc.mcast_add_hash_bit_array, sizeof(rx_info->appr_mc.mcast_add_hash_bit_array));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(&pdev->vars.nig_mirror, sizeof(lm_nig_mirror_t));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.b_is_dmae_ready = FALSE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // adjust the FWD Tx ring consumer - default sb
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_setup_txq(pdev, pdev->tx_info.catchup_chain_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* setup mac flitering to drop all for all clients */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // lm_status = lm_setup_tstorm_mac_filter(pdev); FIXME - necessary??
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_common_setup_alloc_resc(pdev, FALSE ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_vf_setup_alloc_resc(pdev, FALSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_setup_sq(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Only pfdev has an event-queue */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_setup_eq(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_STATUS_SUCCESS != lm_status)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Initialize T1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for( i = 0 ; i < vars->searcher_t1_num_pages ; i ++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero( vars->searcher_t1_virt_addr_table[i], params->ilt_client_page_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Initialize T2 first we make each next filed point to its address +1 then we fixup the edges
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(i=0 ; i < vars->searcher_t2_num_pages ; i ++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (j=0; j < params->ilt_client_page_size; j+=64)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(u64_t*)((char*)vars->searcher_t2_virt_addr_table[i]+j+56) = vars->searcher_t2_phys_addr_table[i].as_u64+j+64; //64bit pointer
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // now fix up the last line in the block to point to the next block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi j = params->ilt_client_page_size - 8;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (i < vars->searcher_t2_num_pages -1)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // this is not the last block
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *(u64_t*)((char*)vars->searcher_t2_virt_addr_table[i]+j) = vars->searcher_t2_phys_addr_table[i+1].as_u64; //64bit pointer
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for( i=0 ;i < vars->timers_linear_num_pages; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(vars->timers_linear_virt_addr_table[i],params->ilt_client_page_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if defined(EMULATION_DOORBELL_FULL_WORKAROUND)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_atomic_set(&vars->doorbells_cnt, DOORBELL_CHECK_FREQUENCY);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_stats_hw_setup(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_stats_hw_setup failed.\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_fw_setup(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // init_context
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_setup_context_pool(pdev) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_setup_context_pool failed.\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (IS_CHANNEL_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_setup_context_pool(pdev) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_setup_context_pool failed.\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.mac_type = MAC_TYPE_NONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.is_pmf = NOT_PMF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_int_coal_info(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(&pdev->vars.nig_mirror, sizeof(pdev->vars.nig_mirror));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Indicate packets from the free descriptor list and the given list
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param rx_common - The chain to free RSC/RX.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param packet_list - A list of packets to indicate.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param idx - Chain index.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param is_stat_handle - Is updating statistic is needed.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiSTATIC void
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_abort_indicate_free_list( IN OUT lm_device_t* pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN lm_rx_chain_common_t* rx_common,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN s_list_t* packet_list,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u32_t idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t is_stat_handle)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_packet_t* pkt = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(; ;)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Run on all the free list
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pkt = (lm_packet_t *) s_list_pop_head(&rx_common->free_descq);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pkt == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pkt->status = LM_STATUS_ABORTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(is_stat_handle)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_COMMON_DRV_STATS_ATOMIC_INC_ETH(pdev, rx_aborted);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (!defined(LINUX) && !defined(__SunOS) && !defined(UEFI) && !defined(DOS))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_push_tail(packet_list, (s_list_entry_t *)pkt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!s_list_is_empty(packet_list))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (!defined(LINUX) && !defined(__SunOS) && !defined(UEFI) && !defined(DOS))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_indicate_rx(pdev, idx, packet_list, LM_STATUS_ABORTED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*******************************************************************************
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Return:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_abort( lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const lm_abort_op_t abort_op,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u32_t idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_packet_t *pkt = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rx_chain_t *rxq_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_rx_chain_common_t *rx_common = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tpa_chain_t *tpa_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t *rx_chain_bd = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_t *rx_chain_sge = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_tx_chain_t *tx_chain = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_t packet_list = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t active_entry = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORM, "### lm_abort abort_op=%d idx=%d\n", abort_op, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(abort_op)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ABORT_OP_RX_CHAIN:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ABORT_OP_INDICATE_RX_CHAIN:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rxq_chain = &LM_RXQ(pdev, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_common = &LM_RXQ_COMMON(pdev, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_chain_bd = &LM_RXQ_CHAIN_BD(pdev, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_chain_sge = LM_RXQ_SGE_PTR_IF_VALID(pdev, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Verify BD's consistent
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIfFastPath( rx_chain_sge && !lm_bd_chains_are_consistent( rx_chain_sge, rx_chain_bd ) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* indicate packets from the active descriptor list */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(; ;)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pkt = (lm_packet_t *) s_list_pop_head(&rxq_chain->active_descq);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(pkt == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_bds_consumed(rx_chain_bd, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( rx_chain_sge )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_bds_consumed(rx_chain_sge, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_COMMON_DRV_STATS_ATOMIC_INC_ETH(pdev, rx_aborted);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // if in shutdown flow or not if in d3 flow ?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (abort_op == ABORT_OP_INDICATE_RX_CHAIN)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (!defined(LINUX) && !defined(__SunOS) && !defined(UEFI) && !defined(DOS))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_push_tail(&packet_list, (s_list_entry_t *)pkt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_push_tail(&rx_common->free_descq, &pkt->link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( ABORT_OP_INDICATE_RX_CHAIN == abort_op )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* indicate packets from the free descriptor list */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_abort_indicate_free_list( pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_common,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &packet_list,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } // ABORT_OP_INDICATE_RX_CHAIN
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Fall Through
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ABORT_OP_TPA_CHAIN:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ABORT_OP_INDICATE_TPA_CHAIN:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain = &LM_TPA(pdev, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_chain_bd = &LM_TPA_CHAIN_BD(pdev, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_common = &LM_TPA_COMMON(pdev, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(s_list_is_empty(&packet_list)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* indicate packets from the active descriptor list */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(i = lm_bd_chain_cons_idx(rx_chain_bd); i != lm_bd_chain_prod_idx(rx_chain_bd); i++ )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Run on all the valid active descriptor
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Valid active descriptors can only be beteen the consumer to the producers
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi active_entry = LM_TPA_BD_ENTRY_TO_ACTIVE_ENTRY(pdev,idx,i);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TPA_ACTIVE_ENTRY_BOUNDARIES_VERIFY(pdev, idx, active_entry);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_TPA_MASK_TEST_ACTIVE_BIT(pdev, idx, active_entry))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_TPA_MASK_CLEAR_ACTIVE_BIT(pdev, idx, active_entry);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pkt = tpa_chain->sge_chain.active_descq_array[active_entry];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(NULL == pkt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg(" Packet is null suppose to be null");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi continue;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_bds_consumed(rx_chain_bd, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // if in shutdown flow or not if in d3 flow ?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((abort_op == ABORT_OP_INDICATE_TPA_CHAIN) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (abort_op == ABORT_OP_INDICATE_RX_CHAIN))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (DBG)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /************start TPA debbug code******************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->dbg_params.pck_ret_abort_active++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /************end TPA debbug code********************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif //DBG
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (!defined(LINUX) && !defined(__SunOS) && !defined(UEFI) && !defined(DOS))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_push_tail(&packet_list, (s_list_entry_t *)pkt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_push_tail(&rx_common->free_descq, &pkt->link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((abort_op == ABORT_OP_INDICATE_TPA_CHAIN) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (abort_op == ABORT_OP_INDICATE_RX_CHAIN))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (DBG)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /************start TPA debbug code******************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Total packet aborted
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tpa_chain->dbg_params.pck_ret_abort += s_list_entry_cnt(&packet_list) + s_list_entry_cnt(&rx_common->free_descq);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if((tpa_chain->dbg_params.pck_ret_abort + tpa_chain->dbg_params.pck_ret_from_chip) !=
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (tpa_chain->dbg_params.pck_received + tpa_chain->dbg_params.pck_received_ind) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("VBD didn't return all packets this chain ");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /************end TPA debbug code******************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif //DBG
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* indicate packets from the free descriptor list */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_abort_indicate_free_list( pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_common,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &packet_list,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FALSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if (DBG)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /************start TPA debbug code******************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // make sure all packets were abort
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(0 != (s_list_entry_cnt(&packet_list) + s_list_entry_cnt(&rx_common->free_descq)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("VBD didn't return all packets this chain ");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /************end TPA debbug code******************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif //DBG
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } // ABORT_OP_INDICATE_TPA_CHAIN
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ABORT_OP_INDICATE_TX_CHAIN:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_chain = &LM_TXQ(pdev, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(; ;)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pkt = (lm_packet_t *) s_list_pop_head(&tx_chain->active_descq);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(pkt == NULL)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pkt->status = LM_STATUS_ABORTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_COMMON_DRV_STATS_ATOMIC_INC_ETH(pdev, tx_aborted);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_bd_chain_bds_consumed(&tx_chain->bd_chain, pkt->u1.tx.bd_used);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pkt->u1.tx.coalesce_buf) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* return coalesce buffer to the chain's pool */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_put_coalesce_buffer(pdev, tx_chain, pkt->u1.tx.coalesce_buf);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pkt->u1.tx.coalesce_buf = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi s_list_push_tail(&packet_list, (s_list_entry_t *)pkt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!s_list_is_empty(&packet_list))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_indicate_tx(pdev, idx, &packet_list);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // changed from pdev->params.l2_tx_bd_page_cnt[idx] to pdev->params.l2_tx_bd_page_cnt[0]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!lm_bd_chain_is_full(&tx_chain->bd_chain));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(s_list_entry_cnt(&tx_chain->coalesce_buf_list) != tx_chain->coalesce_buf_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } // ABORT_OP_INDICATE_TX_CHAIN
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("unknown abort operation.\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } //switch
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_abort */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "57710_int_offsets.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "57711_int_offsets.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "57712_int_offsets.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid ecore_init_e1_firmware(struct _lm_device_t *pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid ecore_init_e1h_firmware(struct _lm_device_t *pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid ecore_init_e2_firmware(struct _lm_device_t *pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiint lm_set_init_arrs(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t const chip_num = CHIP_NUM(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(chip_num)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CHIP_NUM_5710:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( !CHIP_IS_E1(pdev) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_e1_firmware(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi INIT_IRO_ARRAY(pdev) = e1_iro_arr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CHIP_NUM_5711:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CHIP_NUM_5711E:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( !CHIP_IS_E1H(pdev) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_e1h_firmware(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi INIT_IRO_ARRAY(pdev) = e1h_iro_arr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CHIP_NUM_5712:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CHIP_NUM_5713:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CHIP_NUM_5712E:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CHIP_NUM_5713E:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( !CHIP_IS_E2(pdev) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CHIP_NUM_57800:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CHIP_NUM_57810:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CHIP_NUM_57840_4_10:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CHIP_NUM_57840_2_20:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CHIP_NUM_57840_OBSOLETE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case CHIP_NUM_57811:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( !CHIP_IS_E2(pdev) && !CHIP_IS_E3(pdev) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_e2_firmware(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi INIT_IRO_ARRAY(pdev) = e2_iro_arr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "chip-id=%x NOT SUPPORTED\n", CHIP_NUM(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return -1; // for now not supported, can't have all three...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi