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 implement SR-IOV virtualization on
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the PF side
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef VF_INVOLVED
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "lm5710.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "lm_vf.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "577xx_int_offsets.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "command.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistruct vf_pf_msg_hdr *lm_pf_validate_request_header(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, void * virt_buffer)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct vf_pf_msg_hdr * req_hdr = (struct vf_pf_msg_hdr *)virt_buffer;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (req_hdr->resp_msg_offset > vf_info->pf_vf_response.request_size) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi req_hdr = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "VF[%d]: Estimated size of incoming request(%d) exceeds buffer size(%d)\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->relative_vf_id, req_hdr->resp_msg_offset, vf_info->pf_vf_response.request_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return req_hdr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_vf_info_t * lm_pf_find_vf_info_by_rel_id(struct _lm_device_t *pdev, u16_t relative_vf_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (relative_vf_id < pdev->vfs_set.number_of_enabled_vfs) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info = &pdev->vfs_set.vfs_array[relative_vf_id];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_pf_find_vf_info_by_rel_id: VF[%d] is not enabled\n", relative_vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return vf_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_vf_info_t * lm_pf_find_vf_info_by_abs_id(struct _lm_device_t *pdev, u8_t abs_vf_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t relative_vf_id = 0xFFFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_pf_find_vf_info_by_abs_id: abs_vf_id:%d(%d)\n",abs_vf_id,pdev->hw_info.sriov_info.first_vf_in_pf);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (abs_vf_id < pdev->hw_info.sriov_info.first_vf_in_pf) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi relative_vf_id = abs_vf_id - (u8_t)pdev->hw_info.sriov_info.first_vf_in_pf;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (relative_vf_id < pdev->vfs_set.number_of_enabled_vfs) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info = &pdev->vfs_set.vfs_array[relative_vf_id];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_pf_find_vf_info_by_abs_id: VF[a:%d,r:%d] is not enabled\n",abs_vf_id,relative_vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return vf_info;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_download_standard_request(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, void* virt_buffer, u32_t length)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct vf_pf_msg_hdr * requst_hdr = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!(pdev && vf_info && virt_buffer)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "PFVF request with invalid parameters: %p, %p, %p, d\n", pdev,vf_info,virt_buffer,length);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!DBG_BREAK_ON(UNDER_TEST));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((vf_info->pf_vf_response.req_resp_state != VF_PF_WAIT_FOR_START_REQUEST)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi && (vf_info->pf_vf_response.req_resp_state != VF_PF_WAIT_FOR_NEXT_CHUNK_OF_REQUEST)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "VF[%d] does not expect PFVF request (%d)\n", vf_info->relative_vf_id, vf_info->pf_vf_response.req_resp_state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vf_info->pf_vf_response.req_resp_state == VF_PF_WAIT_FOR_START_REQUEST) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //requst_hdr = (struct vf_pf_msg_hdr *)virt_buffer;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (length >= sizeof(struct vf_pf_msg_hdr)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi requst_hdr = lm_pf_validate_request_header(pdev, vf_info, virt_buffer);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (requst_hdr != NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->pf_vf_response.request_offset = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "VF[%d] received too short(%d) PFVF request\n", vf_info->relative_vf_id, length);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi requst_hdr = (struct vf_pf_msg_hdr *)vf_info->pf_vf_response.request_virt_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (requst_hdr != NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (length <= (vf_info->pf_vf_response.request_size - vf_info->pf_vf_response.request_offset)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy((u8_t*)vf_info->pf_vf_response.request_virt_addr + vf_info->pf_vf_response.request_offset, virt_buffer, length);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "VF[%d]: lm_pf_download_standard_request: %d bytes from offset %d\n", vf_info->relative_vf_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi length, vf_info->pf_vf_response.request_offset);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (requst_hdr->resp_msg_offset > (vf_info->pf_vf_response.request_offset + length)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_PENDING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->pf_vf_response.request_offset += length;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->pf_vf_response.req_resp_state = VF_PF_WAIT_FOR_NEXT_CHUNK_OF_REQUEST;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->pf_vf_response.response_virt_addr = (u8_t*)vf_info->pf_vf_response.request_virt_addr + requst_hdr->resp_msg_offset;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->pf_vf_response.request_offset = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->pf_vf_response.req_resp_state = VF_PF_REQUEST_IN_PROCESSING;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->pf_vf_response.req_resp_state = VF_PF_WAIT_FOR_START_REQUEST;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_upload_standard_response(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, void* virt_buffer, u32_t length)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t response_rest;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!(pdev && vf_info && virt_buffer)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "PFVF rresponse with invalid parameters: %p, %p, %p, d\n", pdev,vf_info,virt_buffer,length);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!DBG_BREAK_ON(UNDER_TEST));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (length < sizeof(struct pf_vf_msg_resp))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!DBG_BREAK_ON(UNDER_TEST));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (vf_info->pf_vf_response.req_resp_state) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VF_PF_WAIT_FOR_START_REQUEST:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VF_PF_WAIT_FOR_NEXT_CHUNK_OF_REQUEST:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "VF[%d]:lm_pf_upload_standard_response (LM_STATUS_FAILURE)\n",vf_info->relative_vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VF_PF_REQUEST_IN_PROCESSING:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!DBG_BREAK_ON(UNDER_TEST));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (length > sizeof(struct pf_vf_msg_resp))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi length = sizeof(struct pf_vf_msg_resp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(virt_buffer, vf_info->pf_vf_response.response_virt_addr, length);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VF_PF_RESPONSE_READY:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi response_rest = vf_info->pf_vf_response.response_size - vf_info->pf_vf_response.response_offset;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (length <= response_rest) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->pf_vf_response.req_resp_state = VF_PF_WAIT_FOR_START_REQUEST;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi length = response_rest;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy(virt_buffer, (u8_t*)vf_info->pf_vf_response.response_virt_addr + vf_info->pf_vf_response.response_offset, length);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "VF[%d]:lm_pf_upload_standard_response: %d bytes from offset %d\n",vf_info->relative_vf_id,length,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->pf_vf_response.response_offset);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->pf_vf_response.response_offset += length;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vf_info->pf_vf_response.response_offset == vf_info->pf_vf_response.response_size)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->pf_vf_response.req_resp_state = VF_PF_WAIT_FOR_START_REQUEST;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_upload_standard_request(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, lm_address_t * phys_buffer, u32_t length)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_pf_upload_standard_request is not implemented yet\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_allocate_vfs(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t mm_cli_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t alloc_size = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t num_vfs = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_cli_idx = LM_RESOURCE_COMMON;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_vfs = pdev->hw_info.sriov_info.total_vfs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.number_of_enabled_vfs = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!num_vfs) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_pf_allocate_vfs: SRIOV capability is not found\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_pf_allocate_vfs for %d VFs\n",num_vfs);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi alloc_size = sizeof(lm_vf_info_t) * num_vfs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.vfs_array = mm_alloc_mem(pdev, alloc_size, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(pdev->vfs_set.vfs_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(pdev->vfs_set.vfs_array, alloc_size ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.req_resp_size = (((sizeof(union vf_pf_msg) + CACHE_LINE_SIZE_MASK) & ~CACHE_LINE_SIZE_MASK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi + ((sizeof(union pf_vf_msg) + CACHE_LINE_SIZE_MASK) & ~CACHE_LINE_SIZE_MASK)) * num_vfs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.req_resp_virt_addr = mm_alloc_phys_mem(pdev, pdev->vfs_set.req_resp_size,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->vfs_set.req_resp_phys_addr, 0, LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(pdev->vfs_set.req_resp_virt_addr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.pf_fw_stats_set_data_sz = ((sizeof(struct per_queue_stats) + CACHE_LINE_SIZE_MASK) & ~CACHE_LINE_SIZE_MASK) * num_vfs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.pf_fw_stats_set_virt_data = mm_alloc_phys_mem(pdev, pdev->vfs_set.pf_fw_stats_set_data_sz,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->vfs_set.pf_fw_stats_set_phys_data, 0, LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(pdev->vfs_set.pf_fw_stats_set_virt_data)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi alloc_size = sizeof(lm_stats_fw_t) * num_vfs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.mirror_stats_fw_set = mm_alloc_mem(pdev, alloc_size, mm_cli_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(pdev->vfs_set.mirror_stats_fw_set)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.rss_update_size = ((sizeof(struct eth_rss_update_ramrod_data) + CACHE_LINE_SIZE_MASK) & ~CACHE_LINE_SIZE_MASK) * num_vfs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.rss_update_virt_addr = mm_alloc_phys_mem(pdev, pdev->vfs_set.rss_update_size,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->vfs_set.rss_update_phys_addr, 0, LM_RESOURCE_COMMON);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(pdev->vfs_set.rss_update_virt_addr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_RESOURCE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->hw_info.sriov_info.sriov_control & 0x0001) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_pf_init_vfs(pdev, pdev->hw_info.sriov_info.num_vfs);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "SRIOV enable(after FLR): init %d VFs: status %d\n",pdev->hw_info.sriov_info.num_vfs,lm_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t vf_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_pf_init_vfs returns OK\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (vf_idx = 0; vf_idx < pdev->hw_info.sriov_info.num_vfs; vf_idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_pf_enable_vf(pdev, pdev->hw_info.sriov_info.first_vf_in_pf + vf_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(lm_status != LM_STATUS_SUCCESS) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "SRIOV enable(after FLR): enable VF[%d]: status %d\n",vf_idx,lm_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_init_vfs(struct _lm_device_t *pdev, u16_t num_vfs)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t mem_phys;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t * mem_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t req_resp_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t stats_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t rss_upd_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t vf_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!(pdev && num_vfs && pdev->vfs_set.vfs_array && pdev->vfs_set.req_resp_virt_addr && pdev->vfs_set.pf_fw_stats_set_virt_data));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_VFS_STATS_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.number_of_enabled_vfs = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(pdev->vfs_set.vfs_array, sizeof(lm_vf_info_t)*num_vfs);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(pdev->vfs_set.mirror_stats_fw_set, sizeof(lm_stats_fw_t)*num_vfs);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi req_resp_size = ((sizeof(union vf_pf_msg) + CACHE_LINE_SIZE_MASK) & ~CACHE_LINE_SIZE_MASK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi + ((sizeof(union pf_vf_msg) + CACHE_LINE_SIZE_MASK) & ~CACHE_LINE_SIZE_MASK);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_phys = pdev->vfs_set.req_resp_phys_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_virt = pdev->vfs_set.req_resp_virt_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (vf_idx = 0; vf_idx < num_vfs; vf_idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.vfs_array[vf_idx].pf_vf_response.response_phys_addr = mem_phys;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INC64(&mem_phys, req_resp_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.vfs_array[vf_idx].pf_vf_response.request_virt_addr = mem_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_virt += req_resp_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.vfs_array[vf_idx].pf_vf_response.request_size = req_resp_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.vfs_array[vf_idx].pf_vf_response.req_resp_state = VF_PF_WAIT_FOR_START_REQUEST;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.vfs_array[vf_idx].relative_vf_id = (u8_t)vf_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.vfs_array[vf_idx].abs_vf_id = (u8_t)(vf_idx + pdev->hw_info.sriov_info.first_vf_in_pf);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi stats_size = (sizeof(struct per_queue_stats) + CACHE_LINE_SIZE_MASK) & ~CACHE_LINE_SIZE_MASK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_phys = pdev->vfs_set.pf_fw_stats_set_phys_data;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_virt = pdev->vfs_set.pf_fw_stats_set_virt_data;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (vf_idx = 0; vf_idx < num_vfs; vf_idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.vfs_array[vf_idx].vf_stats.pf_fw_stats_phys_data = mem_phys;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INC64(&mem_phys, stats_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.vfs_array[vf_idx].vf_stats.pf_fw_stats_virt_data = (struct per_queue_stats *)mem_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_virt += stats_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.vfs_array[vf_idx].vf_stats.mirror_stats_fw = pdev->vfs_set.mirror_stats_fw_set + sizeof(lm_stats_fw_t) * vf_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rss_upd_size = (sizeof(struct eth_rss_update_ramrod_data) + CACHE_LINE_SIZE_MASK) & ~CACHE_LINE_SIZE_MASK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_phys = pdev->vfs_set.rss_update_phys_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_virt = pdev->vfs_set.rss_update_virt_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (vf_idx = 0; vf_idx < num_vfs; vf_idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.vfs_array[vf_idx].vf_slowpath_info.slowpath_data.rss_rdata_phys = mem_phys;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INC64(&mem_phys, rss_upd_size);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.vfs_array[vf_idx].vf_slowpath_info.slowpath_data.rss_rdata = (struct eth_rss_update_ramrod_data *)mem_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mem_virt += rss_upd_size;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vfs_set.number_of_enabled_vfs = num_vfs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(pdev->pf_resources.free_sbs,sizeof(pdev->pf_resources.free_sbs));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(pdev->pf_resources.free_fw_clients,sizeof(pdev->pf_resources.free_fw_clients));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero(pdev->pf_resources.free_sw_clients,sizeof(pdev->pf_resources.free_sw_clients));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_VFS_STATS_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_clear_vfs(struct _lm_device_t * pf_dev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TODO: Clean VF Database for FLR needs? */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t base_vfid, vfid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t pretend_val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t ind_cids, start_cid, end_cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pf_dev, FATAL, "vf disable\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi start_cid = (((1 << LM_VF_MAX_RVFID_SIZE) | 0) << LM_VF_CID_WND_SIZE); //1st possible abs VF_ID
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi end_cid = (((1 << LM_VF_MAX_RVFID_SIZE) | 63) << LM_VF_CID_WND_SIZE); //last possible abs VF_ID
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pf_dev, FATAL, "vf disable: clear VFs connections from %d till %d\n",start_cid, end_cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (ind_cids = MAX_ETH_CONS; ind_cids < ETH_MAX_RX_CLIENTS_E2; ind_cids++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pf_dev->vars.connections[ind_cids].con_state = LM_CON_STATE_CLOSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_is_function_after_flr(pf_dev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pf_dev->vfs_set.number_of_enabled_vfs = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pf_dev, FATAL, "vf disable called on a flred function - not much we can do here... \n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* if MCP does not exist for each vf in pf, need to pretend to it and disable igu vf_msix and internal vfid enable bit */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (GET_FLAGS( pf_dev->params.test_mode, TEST_MODE_NO_MCP)){
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pf_dev, FATAL, "bootcode is down fix sriov disable.\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi base_vfid = pf_dev->hw_info.sriov_info.first_vf_in_pf;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (vfid = base_vfid; vfid < base_vfid + pf_dev->vfs_set.number_of_enabled_vfs; vfid++ ) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pretend_val = ABS_FUNC_ID(pf_dev) | (1<<3) | (vfid << 4);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_pretend_func(pf_dev, pretend_val);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pf_dev, IGU_REG_PCI_VF_MSIX_EN, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pf_dev, IGU_REG_PCI_VF_MSIX_FUNC_MASK, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pf_dev, PGLUE_B_REG_INTERNAL_VFID_ENABLE, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_pretend_func(pf_dev, ABS_FUNC_ID(pf_dev) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* This is a clear-on-write register, therefore we actually write 1 to the bit we want to reset */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pf_dev, 0x24d8, 1<<29);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pf_dev, PGLUE_B_REG_SR_IOV_DISABLED_REQUEST_CLR ,(1<<ABS_FUNC_ID(pf_dev)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //REG_WR(pf_dev, PGLUE_B_REG_DISABLE_FLR_SRIOV_DISABLED, PGLUE_B_DISABLE_FLR_SRIOV_DISABLED_REG_DISABLE_SRIOV_DISABLED_REQUEST);*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pf_dev->vfs_set.number_of_enabled_vfs = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_set_vf_ctx(struct _lm_device_t *pdev, u16_t vf_id, void* ctx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = lm_pf_find_vf_info_by_rel_id(pdev, vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!vf_info);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vf_info != NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->um_ctx = ctx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->vf_si_state = PF_SI_WAIT_FOR_ACQUIRING_REQUEST;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->pf_vf_response.req_resp_state = VF_PF_WAIT_FOR_START_REQUEST;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_set_vf_stat_id(struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t vf_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t base_fw_stats_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = lm_pf_find_vf_info_by_rel_id(pdev, vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!vf_info);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vf_info != NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->base_fw_stats_id = base_fw_stats_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "VF[%d]: Stat ID: %d(FW)\n", vf_id, base_fw_stats_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_pf_is_vf_mac_set(struct _lm_device_t *pdev, u16_t vf_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t is_mac_set = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = lm_pf_find_vf_info_by_rel_id(pdev, vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!vf_info);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vf_info != NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi is_mac_set = vf_info->is_mac_set;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return is_mac_set;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_set_vf_base_cam_idx(struct _lm_device_t *pdev, u16_t vf_id, u32_t base_cam_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = lm_pf_find_vf_info_by_rel_id(pdev, vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!vf_info);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vf_info != NULL) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->base_cam_offset = base_cam_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t lm_pf_get_sw_client_idx_from_cid(struct _lm_device_t *pdev, u32_t cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t client_info_idx = 0xFFFFFFFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t abs_vf_id = 0xff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t vf_q_id = 0xff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!IS_CHANNEL_VIRT_MODE_MASTER_PFDEV(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Either MP is disabled OR enabled but not a tx-only connection */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid < MAX_RX_CHAIN(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_info_idx = cid;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi abs_vf_id = GET_ABS_VF_ID_FROM_PF_CID(cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_q_id = GET_VF_Q_ID_FROM_PF_CID(cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info = lm_pf_find_vf_info_by_abs_id(pdev, abs_vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!vf_info);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_info_idx = LM_SW_VF_CLI_ID(vf_info, vf_q_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return client_info_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t lm_pf_get_fw_client_idx_from_cid(struct _lm_device_t *pdev, u32_t cid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t client_info_idx = 0xFFFFFFFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t abs_vf_id = 0xff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t vf_q_id = 0xff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!IS_CHANNEL_VIRT_MODE_MASTER_PFDEV(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (cid < MAX_RX_CHAIN(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_info_idx = LM_FW_CLI_ID(pdev,cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi abs_vf_id = GET_ABS_VF_ID_FROM_PF_CID(cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_q_id = GET_VF_Q_ID_FROM_PF_CID(cid);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info = lm_pf_find_vf_info_by_abs_id(pdev, abs_vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!vf_info);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_info_idx = LM_FW_VF_CLI_ID(vf_info, vf_q_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return client_info_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_vf_get_free_resource(u32_t * resource, u8_t min_num, u8_t max_num, u8_t num)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t i,j;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t base_value = 0xff;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = min_num; i <= (max_num - num); i++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t ind,offset;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (j = 0; j < num; j++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ind = (i + j) / ELEM_OF_RES_ARRAY_SIZE_IN_BITS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi offset = (i+j) % ELEM_OF_RES_ARRAY_SIZE_IN_BITS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (resource[ind] & (1 << offset)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (j == num) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi base_value = i;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return base_value;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_vf_acquire_resource(u32_t * presource, u8_t base_value, u8_t num)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int i,ind,offset;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = base_value; i < (base_value + num); i++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ind = i / ELEM_OF_RES_ARRAY_SIZE_IN_BITS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi offset = i % ELEM_OF_RES_ARRAY_SIZE_IN_BITS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi presource[ind] |= (1 << offset);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_vf_get_resource_value(u32_t * presource, u8_t base_value)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t value;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int ind,offset;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ind = base_value / ELEM_OF_RES_ARRAY_SIZE_IN_BITS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi offset = base_value % ELEM_OF_RES_ARRAY_SIZE_IN_BITS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = presource[ind] & (1 << offset);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return value;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_vf_release_resource(u32_t * presource, u8_t base_value, u8_t num)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi int i,ind,offset;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = base_value; i < (base_value + num); i++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ind = i / ELEM_OF_RES_ARRAY_SIZE_IN_BITS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi offset = i % ELEM_OF_RES_ARRAY_SIZE_IN_BITS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi presource[ind] &= ~(1 << offset);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifndef ARRAY_SIZE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_pf_acquire_vf_chains_resources(struct _lm_device_t *pdev, u16_t vf_id, u32_t num_chains)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t chain_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t min_ndsb;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t min_fw_client, current_fw_client;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t min_sw_client = MAX_RX_CHAIN(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t client_info_entries;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = lm_pf_find_vf_info_by_rel_id(pdev, vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_PF_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->num_allocated_chains = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi min_ndsb = pdev->params.max_pf_sb_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi min_fw_client = pdev->params.max_pf_fw_client_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->params.fw_client_cnt <= pdev->params.max_pf_fw_client_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_info_entries = pdev->params.fw_client_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (min_sw_client < pdev->params.max_pf_fw_client_cnt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi min_sw_client = pdev->params.max_pf_fw_client_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (chain_idx = 0; chain_idx < num_chains; chain_idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->vf_chains[chain_idx].sw_ndsb = lm_vf_get_free_resource(pdev->pf_resources.free_sbs, min_ndsb,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.fw_sb_cnt, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vf_info->vf_chains[chain_idx].sw_ndsb == 0xFF) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "No SBs from %d to %d\n",min_ndsb,pdev->params.fw_sb_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->vf_chains[chain_idx].fw_ndsb = LM_FW_SB_ID(pdev,vf_info->vf_chains[chain_idx].sw_ndsb);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi min_ndsb = vf_info->vf_chains[chain_idx].sw_ndsb + 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi current_fw_client = lm_vf_get_free_resource(pdev->pf_resources.free_fw_clients, min_fw_client,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.fw_client_cnt, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (current_fw_client == 0xFF) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "No FW Clients from %d to %d\n",min_fw_client,pdev->params.fw_client_cnt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi current_fw_client = vf_info->vf_chains[chain_idx].sw_client_id = lm_vf_get_free_resource(pdev->pf_resources.free_sw_clients, min_sw_client, client_info_entries, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vf_info->vf_chains[chain_idx].sw_client_id == 0xFF) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "No Clients from %d to %d\n",min_sw_client,client_info_entries);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->vf_chains[chain_idx].fw_client_id = LM_FW_CLI_ID(pdev,current_fw_client);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->vf_chains[chain_idx].fw_qzone_id = LM_FW_DHC_QZONE_ID(pdev, vf_info->vf_chains[chain_idx].sw_ndsb);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi min_fw_client = current_fw_client + 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi min_sw_client = vf_info->vf_chains[chain_idx].sw_client_id + 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->num_allocated_chains++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vf_info->num_allocated_chains) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (chain_idx = 0; chain_idx < vf_info->num_allocated_chains; chain_idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_acquire_resource(pdev->pf_resources.free_sbs, vf_info->vf_chains[chain_idx].sw_ndsb, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_acquire_resource(pdev->pf_resources.free_fw_clients, vf_info->vf_chains[chain_idx].fw_client_id - pdev->params.base_fw_client_id, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_acquire_resource(pdev->pf_resources.free_sw_clients, vf_info->vf_chains[chain_idx].sw_client_id, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "VF[%d(rel)] received resourses for chain %d: SW_NDSB=%d, FW_CLIENT_ID=%d, SW_CLIENT_ID=%d\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi chain_idx,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->vf_chains[chain_idx].sw_ndsb,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->vf_chains[chain_idx].fw_client_id - pdev->params.base_fw_client_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->vf_chains[chain_idx].sw_client_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_PF_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return vf_info->num_allocated_chains;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_pf_release_vf_chains_resources(struct _lm_device_t *pdev, u16_t vf_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t num_chains, chain_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = lm_pf_find_vf_info_by_rel_id(pdev, vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_chains = vf_info->num_allocated_chains;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!vf_info->was_malicious)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_PF_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (chain_idx = 0; chain_idx < num_chains; chain_idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_release_resource(pdev->pf_resources.free_sbs, vf_info->vf_chains[chain_idx].sw_ndsb, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_release_resource(pdev->pf_resources.free_fw_clients, vf_info->vf_chains[chain_idx].fw_client_id - pdev->params.base_fw_client_id, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_release_resource(pdev->pf_resources.free_sw_clients, vf_info->vf_chains[chain_idx].sw_client_id, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_PF_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_pf_release_separate_vf_chain_resources(struct _lm_device_t *pdev, u16_t vf_id, u8_t chain_num)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_info_t * vf_info = lm_pf_find_vf_info_by_rel_id(pdev, vf_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!vf_info->was_malicious)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (chain_num < vf_info->num_allocated_chains)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_PF_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_release_resource(pdev->pf_resources.free_sbs, vf_info->vf_chains[chain_num].sw_ndsb, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_release_resource(pdev->pf_resources.free_fw_clients, vf_info->vf_chains[chain_num].fw_client_id - pdev->params.base_fw_client_id, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_vf_release_resource(pdev->pf_resources.free_sw_clients, vf_info->vf_chains[chain_num].sw_client_id, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_PF_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_pf_init_vf_client(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, u8_t q_id)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_mac_obj(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->client_info[LM_SW_VF_CLI_ID(vf_info,q_id)].mac_obj,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_FW_VF_CLI_ID(vf_info,q_id),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_VF_Q_ID_TO_PF_CID(pdev, vf_info, q_id),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FUNC_ID(pdev),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH(pdev, mac_rdata)[LM_CLI_IDX_NDIS],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH_PHYS(pdev, mac_rdata)[LM_CLI_IDX_NDIS],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_FILTER_MAC_PENDING,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (unsigned long *)&pdev->client_info[LM_SW_VF_CLI_ID(vf_info,q_id)].sp_mac_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_OBJ_TYPE_RX_TX,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->slowpath_info.macs_pool);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CHIP_IS_E1(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_vlan_mac_obj(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->client_info[LM_SW_VF_CLI_ID(vf_info,q_id)].mac_vlan_obj,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_FW_VF_CLI_ID(vf_info,q_id),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_VF_Q_ID_TO_PF_CID(pdev, vf_info, q_id),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi FUNC_ID(pdev),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH(pdev, mac_rdata)[LM_CLI_IDX_NDIS],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SLOWPATH_PHYS(pdev, mac_rdata)[LM_CLI_IDX_NDIS],
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_FILTER_VLAN_MAC_PENDING,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (unsigned long *)&pdev->client_info[LM_SW_VF_CLI_ID(vf_info,q_id)].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 return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_pf_init_vf_slow_path(struct _lm_device_t *pdev, lm_vf_info_t *vf_info)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ecore_init_rss_config_obj(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &vf_info->vf_slowpath_info.rss_conf_obj,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_FW_VF_CLI_ID(vf_info, LM_SW_LEADING_RSS_CID(pdev)),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_VF_Q_ID_TO_PF_CID(pdev, vf_info,LM_SW_LEADING_RSS_CID(pdev)),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->abs_vf_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 8 + vf_info->abs_vf_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_VF_SLOWPATH(vf_info, rss_rdata),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_VF_SLOWPATH_PHYS(vf_info, rss_rdata),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_FILTER_RSS_CONF_PENDING,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (unsigned long *)&vf_info->vf_slowpath_info.sp_rss_state,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ECORE_OBJ_TYPE_RX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->was_malicious = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_vf_wait_for_stats_ready(struct _lm_device_t *pdev, lm_vf_info_t *vf_info)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_wait_state_change(pdev, &vf_info->vf_stats.vf_stats_state, VF_STATS_REQ_READY);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_init_vf_client_init_data(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, u8_t q_id,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct sw_vf_pf_rxq_params * rxq_params,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct sw_vf_pf_txq_params * txq_params)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct client_init_ramrod_data *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_address_t q_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t client_interrupt_moderation_level;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt = &(pdev->client_info[LM_SW_VF_CLI_ID(vf_info,q_id)].client_init_data_virt->init_data);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(client_init_data_virt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* General Structure */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->general.activate_flg = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->general.client_id = LM_FW_VF_CLI_ID(vf_info, q_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->general.is_fcoe_flg = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->general.statistics_counter_id = LM_FW_VF_STATS_CNT_ID(vf_info);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->general.statistics_en_flg = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->general.sp_client_id = LM_FW_CLI_ID(pdev, LM_SW_LEADING_RSS_CID(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->general.mtu = mm_cpu_to_le16((u16_t)rxq_params->mtu);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->general.func_id = 8 + vf_info->abs_vf_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->general.cos = 0;//The connection cos, if applicable only if STATIC_COS is set
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->general.traffic_type = LLFC_TRAFFIC_TYPE_NW;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->general.fp_hsi_ver = vf_info->fp_hsi_ver;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.status_block_id = LM_FW_VF_SB_ID(vf_info,q_id); //LM_FW_VF_SB_ID(vf_info, LM_VF_Q_TO_SB_ID(vf_info,q_id));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.client_qzone_id = LM_FW_VF_QZONE_ID(vf_info, q_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // client_init_data_virt->rx.tpa_en_flg = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.max_agg_size = mm_cpu_to_le16(0); /* TPA related only */;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.extra_data_over_sgl_en_flg = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (rxq_params->flags & SW_VFPF_QUEUE_FLG_CACHE_ALIGN) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.cache_line_alignment_log_size = rxq_params->cache_line_log;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.cache_line_alignment_log_size = (u8_t)LOG2(CACHE_LINE_SIZE/* TODO mm_get_cache_line_alignment()*/);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.int_coalesing_mode == LM_INT_COAL_PERIODIC_SYNC)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_interrupt_moderation_level = vf_info->current_interrupr_moderation;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((rxq_params->flags & SW_VFPF_QUEUE_FLG_DHC)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.enable_dynamic_hc = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.enable_dynamic_hc = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (client_interrupt_moderation_level == VPORT_INT_MOD_ADAPTIVE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_interrupt_moderation_level = VPORT_INT_MOD_UNDEFINED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.enable_dynamic_hc = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_interrupt_moderation_level = VPORT_INT_MOD_OFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_pf_update_vf_ndsb(pdev, vf_info, q_id, client_interrupt_moderation_level);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.outer_vlan_removal_enable_flg = IS_MULTI_VNIC(pdev)? TRUE: FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.inner_vlan_removal_enable_flg = TRUE; //= !pdev->params.keep_vlan_tag;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.state = CLIENT_INIT_RX_DATA_ACCEPT_ANY_VLAN; /*If VF L2 client established without "accept_any_vlan" flag, the firmware is trying */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.state = CLIENT_INIT_TX_DATA_ACCEPT_ANY_VLAN; /*to match packets with both MAC and VLAN, fails and send the packet to
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi the network (transfer leakage).
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi The "accept_any_vlan" is only set later in the "set rx mode" command,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi and then the TX-switching is working again.*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi q_addr.as_u64 = rxq_params->rxq_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.bd_page_base.lo= mm_cpu_to_le32(q_addr.as_u32.low);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.bd_page_base.hi= mm_cpu_to_le32(q_addr.as_u32.high);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi q_addr.as_u64 = rxq_params->rcq_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.cqe_page_base.lo = mm_cpu_to_le32(q_addr.as_u32.low);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.cqe_page_base.hi = mm_cpu_to_le32(q_addr.as_u32.high);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!q_id) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.is_leading_rss = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.is_approx_mcast = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.approx_mcast_engine_id = 8 + vf_info->abs_vf_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.rss_engine_id = 8 + vf_info->abs_vf_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.max_bytes_on_bd = mm_cpu_to_le16((rxq_params->buf_sz) - (pdev)->params.rcv_buffer_offset);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Status block index init we do for Rx + Tx together so that we ask which cid we are only once */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->rx.rx_sb_index_number = rxq_params->sb_index;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.tx_sb_index_number = txq_params->sb_index;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* TX Data (remaining , sb index above...) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* ooo cid doesn't have a tx chain... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi q_addr.as_u64 = txq_params->txq_addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.tx_bd_page_base.hi = mm_cpu_to_le32(q_addr.as_u32.high);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.tx_bd_page_base.lo = mm_cpu_to_le32(q_addr.as_u32.low);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.tx_status_block_id = LM_FW_VF_SB_ID(vf_info,txq_params->vf_sb);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.enforce_security_flg = TRUE;//FALSE; /* TBD: turn on for KVM VF? */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Tx Switching... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.tss_leading_client_id = LM_FW_VF_CLI_ID(vf_info, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef __LINUX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.tx_switching_flg = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.anti_spoofing_flg = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.tx_switching_flg = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.anti_spoofing_flg = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* FC */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.l2_fw_flow_ctrl)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t low_thresh = mm_cpu_to_le16(min(250, ((u16_t)(LM_RXQ(pdev, cid).common.desc_cnt))/4));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t high_thresh = mm_cpu_to_le16(min(350, ((u16_t)(LM_RXQ(pdev, cid).common.desc_cnt))/2));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->fc.cqe_pause_thr_low = low_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->fc.bd_pause_thr_low = low_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->fc.sge_pause_thr_low = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->fc.rx_cos_mask = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->fc.cqe_pause_thr_high = high_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->fc.bd_pause_thr_high = high_thresh;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->fc.sge_pause_thr_high = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.refuse_outband_vlan_flg = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // for encapsulated packets
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // the hw ip id will be the inner ip id, the hw will incremnet the inner ip id
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // this means that if the outer ip header is ipv4, its ip id will not be incremented.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.tunnel_lso_inc_ip_id = INT_HEADER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // In case of non-Lso encapsulated packets with L4 checksum offload, the pseudo checksum location - on BD
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.tunnel_non_lso_pcsum_location = CSUM_ON_BD;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // In case of non-Lso encapsulated packets with outer L3 ip checksum offload, the pseudo checksum location - on BD
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_init_data_virt->tx.tunnel_non_lso_outer_ip_csum_location = CSUM_ON_BD;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_pf_is_sriov_valid(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t res = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PFDEV(pdev)) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->hw_info.sriov_info.total_vfs) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "The card has valid SRIOV caps\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi res = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "The card has not valid SRIOV caps\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi res = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "Request of validity SRIOV caps is not applicable for VF\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi res = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return res;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_pf_allocate_vf_igu_sbs(lm_device_t *pdev, lm_vf_info_t *vf_info, u8_t num_of_igu_sbs)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t num_of_vf_desired_vf_chains;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t starting_from = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pdev == NULL) || (vf_info == NULL))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->num_igu_sb_available = lm_pf_get_vf_available_igu_blocks(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (vf_info->num_igu_sb_available == 0)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_of_vf_desired_vf_chains = min(vf_info->num_igu_sb_available, LM_VF_CHAINS_PER_PF(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_of_vf_desired_vf_chains = min(num_of_vf_desired_vf_chains, num_of_igu_sbs);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_PF_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < num_of_vf_desired_vf_chains; idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi starting_from = vf_info->vf_chains[idx].igu_sb_id = lm_pf_get_next_free_igu_block_id(pdev, starting_from);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (starting_from == 0xFF)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_pf_acquire_vf_igu_block(pdev, starting_from, vf_info->abs_vf_id, idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_PF_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_of_vf_desired_vf_chains = idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->num_igu_sb_available = pdev->hw_info.intr_blk_info.igu_info.vf_igu_info[vf_info->abs_vf_id].igu_sb_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi num_of_vf_desired_vf_chains = min(vf_info->num_igu_sb_available, num_of_igu_sbs);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (idx = 0; idx < num_of_vf_desired_vf_chains; idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->vf_chains[idx].igu_sb_id = pdev->hw_info.intr_blk_info.igu_info.vf_igu_info[vf_info->abs_vf_id].igu_base_sb + idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return num_of_vf_desired_vf_chains;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_pf_release_vf_igu_sbs(struct _lm_device_t *pdev, struct _lm_vf_info_t *vf_info)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_pf_get_max_number_of_vf_igu_sbs(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t max_igu_sbs = pdev->hw_info.sriov_info.total_vfs
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * pdev->hw_info.intr_blk_info.igu_info.vf_igu_info[0].igu_sb_cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return max_igu_sbs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_pf_get_next_free_igu_block_id(lm_device_t *pdev, u8_t starting_from)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t igu_sb_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t igu_free_sb_id = 0xFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (igu_sb_idx = starting_from; igu_sb_idx < IGU_REG_MAPPING_MEMORY_SIZE; igu_sb_idx++ )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_igu_block_t * lm_igu_sb = &IGU_SB(pdev,igu_sb_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_igu_sb->status & LM_IGU_STATUS_AVAILABLE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!(lm_igu_sb->status & LM_IGU_STATUS_PF) && !(lm_igu_sb->status & LM_IGU_STATUS_BUSY))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi igu_free_sb_id = igu_sb_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return igu_free_sb_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_pf_clear_vf_igu_blocks(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t igu_sb_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (igu_sb_idx = 0; igu_sb_idx < IGU_REG_MAPPING_MEMORY_SIZE; igu_sb_idx++ )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_igu_block_t * lm_igu_sb = &IGU_SB(pdev,igu_sb_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_igu_sb->status & LM_IGU_STATUS_AVAILABLE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!(lm_igu_sb->status & LM_IGU_STATUS_PF))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(PFDEV(pdev), IGU_REG_MAPPING_MEMORY + 4*igu_sb_idx, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_igu_sb->vf_number = lm_igu_sb->vector_number = 0xFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_igu_sb->status &= ~LM_IGU_STATUS_BUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_pf_release_vf_igu_block(lm_device_t *pdev, u8_t igu_sb_idx)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_igu_block_t * lm_igu_sb = &IGU_SB(pdev,igu_sb_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t res = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!(lm_igu_sb->status & LM_IGU_STATUS_PF) && (lm_igu_sb->status & LM_IGU_STATUS_AVAILABLE) && (igu_sb_idx < IGU_REG_MAPPING_MEMORY_SIZE))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(PFDEV(pdev), IGU_REG_MAPPING_MEMORY + 4*igu_sb_idx, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_igu_sb->vf_number = lm_igu_sb->vector_number = 0xFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_igu_sb->status &= ~LM_IGU_STATUS_BUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi res = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return res;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_pf_acquire_vf_igu_block(lm_device_t *pdev, u8_t igu_sb_idx, u8_t abs_vf_id, u8_t vector_number)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_igu_block_t * lm_igu_sb = &IGU_SB(pdev,igu_sb_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t res = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t value = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!(lm_igu_sb->status & LM_IGU_STATUS_PF) && (lm_igu_sb->status & LM_IGU_STATUS_AVAILABLE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi && !(lm_igu_sb->status & LM_IGU_STATUS_BUSY) && (igu_sb_idx < IGU_REG_MAPPING_MEMORY_SIZE))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi value = (IGU_REG_MAPPING_MEMORY_FID_MASK & (abs_vf_id << IGU_REG_MAPPING_MEMORY_FID_SHIFT))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi | (IGU_REG_MAPPING_MEMORY_VECTOR_MASK & (vector_number << IGU_REG_MAPPING_MEMORY_VECTOR_SHIFT))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi | IGU_REG_MAPPING_MEMORY_VALID;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(PFDEV(pdev), IGU_REG_MAPPING_MEMORY + 4*igu_sb_idx, value);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_igu_sb->vf_number = abs_vf_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_igu_sb->vector_number = vector_number;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_igu_sb->status |= LM_IGU_STATUS_BUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi res = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return res;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8_t lm_pf_get_vf_available_igu_blocks(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t igu_sb_idx;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t available_igu_sbs = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (igu_sb_idx = 0; igu_sb_idx < IGU_REG_MAPPING_MEMORY_SIZE; igu_sb_idx++ )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_igu_block_t * lm_igu_sb = &IGU_SB(pdev,igu_sb_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_igu_sb->status & LM_IGU_STATUS_AVAILABLE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!(lm_igu_sb->status & LM_IGU_STATUS_PF) && !(lm_igu_sb->status & LM_IGU_STATUS_BUSY))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi available_igu_sbs++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return available_igu_sbs;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_update_vf_default_vlan(IN struct _lm_device_t *pdev, IN struct _lm_vf_info_t * vf_info,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u16_t silent_vlan_value,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u16_t silent_vlan_mask,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t silent_vlan_removal_flg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t silent_vlan_change_flg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u16_t default_vlan,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t default_vlan_enable_flg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN const u8_t default_vlan_change_flg)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct client_update_ramrod_data * client_update_data_virt = NULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t vf_cid_of_pf = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t type = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t q_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (q_idx = 0; q_idx < vf_info->vf_si_num_of_active_q; q_idx++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt = pdev->client_info[LM_SW_VF_CLI_ID(vf_info, q_idx)].update.data_virt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL(client_update_data_virt)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_mem_zero((void *) client_update_data_virt , sizeof(struct client_update_ramrod_data));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf( LM_CLI_UPDATE_NOT_USED != pdev->client_info[LM_SW_VF_CLI_ID(vf_info, q_idx)].update.state);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[LM_SW_VF_CLI_ID(vf_info, q_idx)].update.state = LM_CLI_UPDATE_USED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->client_id = LM_FW_VF_CLI_ID(vf_info, q_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->func_id = 8 + vf_info->abs_vf_id;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->silent_vlan_value = mm_cpu_to_le16(silent_vlan_value);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->silent_vlan_mask = mm_cpu_to_le16(silent_vlan_mask);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->silent_vlan_removal_flg = silent_vlan_removal_flg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->silent_vlan_change_flg = silent_vlan_change_flg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->default_vlan = mm_cpu_to_le16(default_vlan);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->default_vlan_enable_flg = default_vlan_enable_flg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->default_vlan_change_flg = default_vlan_change_flg;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->refuse_outband_vlan_flg = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_update_data_virt->refuse_outband_vlan_change_flg = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_cid_of_pf = LM_VF_Q_ID_TO_PF_CID(pdev, vf_info, q_idx);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi type = (ETH_CONNECTION_TYPE | ((8 + vf_info->abs_vf_id) << SPE_HDR_T_FUNCTION_ID_SHIFT));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_sq_post(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_cid_of_pf,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RAMROD_CMD_ID_ETH_CLIENT_UPDATE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi CMD_PRIORITY_MEDIUM,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi type,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[LM_SW_VF_CLI_ID(vf_info, q_idx)].update.data_phys.as_u64);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_ETH_CON_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_wait_state_change(pdev, &pdev->client_info[LM_SW_VF_CLI_ID(vf_info, q_idx)].update.state, LM_CLI_UPDATE_RECV);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->client_info[LM_SW_VF_CLI_ID(vf_info, q_idx)].update.state = LM_CLI_UPDATE_NOT_USED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_update_vf_ndsb(IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_vf_info_t *vf_info,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u8_t relative_in_vf_ndsb,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u16_t interrupt_mod_level)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t dhc_timeout, hc_rx_timeout, hc_tx_timeout;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_int_coalesing_info*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ic = &pdev->vars.int_coal;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t rx_coal_usec,tx_coal_usec;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (interrupt_mod_level)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VPORT_INT_MOD_UNDEFINED:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dhc_timeout = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hc_rx_timeout = (u8_t)(ic->hc_usec_u_sb[HC_INDEX_VF_ETH_RX_CQ_CONS] / HC_TIMEOUT_RESOLUTION_IN_US);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(HC_INDEX_VF_ETH_TX_CQ_CONS < HC_USTORM_SB_NUM_INDICES);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hc_tx_timeout = (u8_t)(ic->hc_usec_c_sb[HC_INDEX_VF_ETH_TX_CQ_CONS - HC_USTORM_SB_NUM_INDICES] / HC_TIMEOUT_RESOLUTION_IN_US);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VPORT_INT_MOD_ADAPTIVE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dhc_timeout = (u8_t)pdev->params.hc_timeout0[SM_RX_ID][HC_INDEX_VF_ETH_RX_CQ_CONS];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hc_rx_timeout = (u8_t)(ic->hc_usec_u_sb[HC_INDEX_VF_ETH_RX_CQ_CONS] / HC_TIMEOUT_RESOLUTION_IN_US);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hc_tx_timeout = (u8_t)(ic->hc_usec_c_sb[HC_INDEX_VF_ETH_TX_CQ_CONS - HC_USTORM_SB_NUM_INDICES] / HC_TIMEOUT_RESOLUTION_IN_US);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VPORT_INT_MOD_OFF:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dhc_timeout = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hc_rx_timeout = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hc_tx_timeout = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VPORT_INT_MOD_LOW:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dhc_timeout = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_coal_usec = 1000000 / pdev->params.vf_int_per_sec_rx[LM_VF_INT_LOW_IDX];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_coal_usec = 1000000 / pdev->params.vf_int_per_sec_tx[LM_VF_INT_LOW_IDX];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hc_rx_timeout = (u8_t)(rx_coal_usec / HC_TIMEOUT_RESOLUTION_IN_US);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hc_tx_timeout = (u8_t)(rx_coal_usec / HC_TIMEOUT_RESOLUTION_IN_US);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VPORT_INT_MOD_MEDIUM:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dhc_timeout = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_coal_usec = 1000000 / pdev->params.vf_int_per_sec_rx[LM_VF_INT_MEDIUM_IDX];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_coal_usec = 1000000 / pdev->params.vf_int_per_sec_tx[LM_VF_INT_MEDIUM_IDX];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hc_rx_timeout = (u8_t)(rx_coal_usec / HC_TIMEOUT_RESOLUTION_IN_US);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hc_tx_timeout = (u8_t)(rx_coal_usec / HC_TIMEOUT_RESOLUTION_IN_US);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VPORT_INT_MOD_HIGH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dhc_timeout = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rx_coal_usec = 1000000 / pdev->params.vf_int_per_sec_rx[LM_VF_INT_HIGH_IDX];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tx_coal_usec = 1000000 / pdev->params.vf_int_per_sec_tx[LM_VF_INT_HIGH_IDX];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hc_rx_timeout = (u8_t)(rx_coal_usec / HC_TIMEOUT_RESOLUTION_IN_US);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi hc_tx_timeout = (u8_t)(rx_coal_usec / HC_TIMEOUT_RESOLUTION_IN_US);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status == LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t dhc_enable;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t timeout;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t index;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (dhc_timeout)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dhc_enable = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi timeout = dhc_timeout;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(PFDEV(pdev), CSEM_REG_FAST_MEMORY + CSTORM_BYTE_COUNTER_OFFSET(LM_FW_VF_DHC_QZONE_ID(vf_info, relative_in_vf_ndsb), HC_INDEX_VF_ETH_RX_CQ_CONS), 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi dhc_enable = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi timeout = hc_rx_timeout;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_setup_ndsb_index(pdev, LM_SW_VF_SB_ID(vf_info,relative_in_vf_ndsb), HC_INDEX_VF_ETH_RX_CQ_CONS, SM_RX_ID, timeout, dhc_enable);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_setup_ndsb_index(pdev, LM_SW_VF_SB_ID(vf_info,relative_in_vf_ndsb), HC_INDEX_VF_ETH_TX_CQ_CONS, SM_TX_ID, hc_tx_timeout, FALSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (index = 0; index < sizeof(struct hc_status_block_data_e2)/sizeof(u32_t); index++) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE32(pdev, CSTORM_STATUS_BLOCK_DATA_OFFSET(LM_FW_VF_SB_ID(vf_info, relative_in_vf_ndsb)) + sizeof(u32_t)*index,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *((u32_t*)(&pdev->vars.status_blocks_arr[LM_SW_VF_SB_ID(vf_info,relative_in_vf_ndsb)].hc_status_block_data.e2_sb_data) + index), BAR_CSTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_pf_update_vf_ndsbs(IN struct _lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN struct _lm_vf_info_t *vf_info,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi IN u16_t interrupt_mod_level)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t q_idx = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t is_hc_available_on_host;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t client_interrupt_mod_level;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.int_coalesing_mode == LM_INT_COAL_PERIODIC_SYNC)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi is_hc_available_on_host = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi is_hc_available_on_host = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (interrupt_mod_level)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VPORT_INT_MOD_OFF:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VPORT_INT_MOD_UNDEFINED:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (is_hc_available_on_host)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi interrupt_mod_level = VPORT_INT_MOD_ADAPTIVE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VPORT_INT_MOD_ADAPTIVE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VPORT_INT_MOD_LOW:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VPORT_INT_MOD_MEDIUM:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case VPORT_INT_MOD_HIGH:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!is_hc_available_on_host)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi interrupt_mod_level = VPORT_INT_MOD_OFF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_status != LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi vf_info->current_interrupr_moderation = interrupt_mod_level;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (q_idx = 0; q_idx < vf_info->vf_si_num_of_active_q; q_idx++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_interrupt_mod_level = interrupt_mod_level;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((interrupt_mod_level == VPORT_INT_MOD_ADAPTIVE) && !pdev->client_info[LM_SW_VF_CLI_ID(vf_info,q_idx)].client_init_data_virt->init_data.rx.enable_dynamic_hc)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi client_interrupt_mod_level = VPORT_INT_MOD_UNDEFINED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_pf_update_vf_ndsb(pdev, vf_info, q_idx, client_interrupt_mod_level);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif //VF_INVOLVED