75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/******************************************************************************
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
49b7860084dbba18bc00b29413d6182197f9fe93Robert Mustacchi Copyright (c) 2001-2015, Intel Corporation
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi All rights reserved.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi Redistribution and use in source and binary forms, with or without
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi modification, are permitted provided that the following conditions are met:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi 1. Redistributions of source code must retain the above copyright notice,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi this list of conditions and the following disclaimer.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi 2. Redistributions in binary form must reproduce the above copyright
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi notice, this list of conditions and the following disclaimer in the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi documentation and/or other materials provided with the distribution.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi 3. Neither the name of the Intel Corporation nor the names of its
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi contributors may be used to endorse or promote products derived from
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi this software without specific prior written permission.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi POSSIBILITY OF SUCH DAMAGE.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi******************************************************************************/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/*$FreeBSD$*/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi#include "e1000_api.h"
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_init_phy_params_vf(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_init_nvm_params_vf(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_release_vf(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_acquire_vf(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_setup_link_vf(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_get_bus_info_pcie_vf(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_init_mac_params_vf(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_check_for_link_vf(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_get_link_up_info_vf(struct e1000_hw *hw, u16 *speed,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 *duplex);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_init_hw_vf(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_reset_hw_vf(struct e1000_hw *hw);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_update_mc_addr_list_vf(struct e1000_hw *hw, u8 *, u32);
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchistatic int e1000_rar_set_vf(struct e1000_hw *, u8 *, u32);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_read_mac_addr_vf(struct e1000_hw *);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_init_phy_params_vf - Inits PHY params
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Doesn't do much - there's no PHY available to the VF.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_init_phy_params_vf(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_init_phy_params_vf");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->phy.type = e1000_phy_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->phy.ops.acquire = e1000_acquire_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->phy.ops.release = e1000_release_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_init_nvm_params_vf - Inits NVM params
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Doesn't do much - there's no NVM available to the VF.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_init_nvm_params_vf(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_init_nvm_params_vf");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->nvm.type = e1000_nvm_none;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->nvm.ops.acquire = e1000_acquire_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->nvm.ops.release = e1000_release_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_init_mac_params_vf - Inits MAC params
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_init_mac_params_vf(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_mac_info *mac = &hw->mac;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_init_mac_params_vf");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Set media type */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /*
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Virtual functions don't care what they're media type is as they
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * have no direct access to the PHY, or the media. That is handled
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * by the physical function driver.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->phy.media_type = e1000_media_type_unknown;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* No ASF features for the VF driver */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->asf_firmware_present = FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* ARC subsystem not supported */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->arc_subsystem_valid = FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Disable adaptive IFS mode so the generic funcs don't do anything */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->adaptive_ifs = FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* VF's have no MTA Registers - PF feature only */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->mta_reg_count = 128;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* VF's have no access to RAR entries */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->rar_entry_count = 1;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Function pointers */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* link setup */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.setup_link = e1000_setup_link_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* bus type/speed/width */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.get_bus_info = e1000_get_bus_info_pcie_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* reset */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.reset_hw = e1000_reset_hw_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* hw initialization */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.init_hw = e1000_init_hw_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* check for link */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.check_for_link = e1000_check_for_link_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* link info */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.get_link_up_info = e1000_get_link_up_info_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* multicast address update */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* set mac address */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.rar_set = e1000_rar_set_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* read mac address */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->ops.read_mac_addr = e1000_read_mac_addr_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_init_function_pointers_vf - Inits function pointers
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchivoid e1000_init_function_pointers_vf(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_init_function_pointers_vf");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->mac.ops.init_params = e1000_init_mac_params_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->nvm.ops.init_params = e1000_init_nvm_params_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->phy.ops.init_params = e1000_init_phy_params_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->mbx.ops.init_params = e1000_init_mbx_params_vf;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_acquire_vf - Acquire rights to access PHY or NVM.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * There is no PHY or NVM so we want all attempts to acquire these to fail.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * In addition, the MAC registers to access PHY/NVM don't exist so we don't
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * even want any SW to attempt to use them.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchistatic s32 e1000_acquire_vf(struct e1000_hw E1000_UNUSEDARG *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return -E1000_ERR_PHY;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_release_vf - Release PHY or NVM
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * There is no PHY or NVM so we want all attempts to acquire these to fail.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * In addition, the MAC registers to access PHY/NVM don't exist so we don't
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * even want any SW to attempt to use them.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchistatic void e1000_release_vf(struct e1000_hw E1000_UNUSEDARG *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_setup_link_vf - Sets up link.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Virtual functions cannot change link.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchistatic s32 e1000_setup_link_vf(struct e1000_hw E1000_UNUSEDARG *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_setup_link_vf");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_get_bus_info_pcie_vf - Gets the bus info.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Virtual functions are not really on their own bus.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_get_bus_info_pcie_vf(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_bus_info *bus = &hw->bus;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_get_bus_info_pcie_vf");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Do not set type PCI-E because we don't want disable master to run */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi bus->type = e1000_bus_type_reserved;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi bus->speed = e1000_bus_speed_2500;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_get_link_up_info_vf - Gets link info.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @speed: pointer to 16 bit value to store link speed.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @duplex: pointer to 16 bit value to store duplex.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Since we cannot read the PHY and get accurate link info, we must rely upon
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * the status register's data which is often stale and inaccurate.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_get_link_up_info_vf(struct e1000_hw *hw, u16 *speed,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 *duplex)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 status;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_get_link_up_info_vf");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi status = E1000_READ_REG(hw, E1000_STATUS);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (status & E1000_STATUS_SPEED_1000) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *speed = SPEED_1000;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("1000 Mbs, ");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } else if (status & E1000_STATUS_SPEED_100) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *speed = SPEED_100;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("100 Mbs, ");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } else {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *speed = SPEED_10;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("10 Mbs, ");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (status & E1000_STATUS_FD) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *duplex = FULL_DUPLEX;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Full Duplex\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi } else {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *duplex = HALF_DUPLEX;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Half Duplex\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_reset_hw_vf - Resets the HW
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * VF's provide a function level reset. This is done using bit 26 of ctrl_reg.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * This is all the reset we can perform on a VF.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_reset_hw_vf(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_mbx_info *mbx = &hw->mbx;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 timeout = E1000_VF_INIT_TIMEOUT;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val = -E1000_ERR_MAC_INIT;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 ctrl, msgbuf[3];
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u8 *addr = (u8 *)(&msgbuf[1]);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_reset_hw_vf");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT("Issuing a function level reset to MAC\n");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ctrl = E1000_READ_REG(hw, E1000_CTRL);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_RST);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* we cannot reset while the RSTI / RSTD bits are asserted */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi while (!mbx->ops.check_for_rst(hw, 0) && timeout) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi timeout--;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi usec_delay(5);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (timeout) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* mailbox timeout can now become active */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mbx->timeout = E1000_VF_MBX_INIT_TIMEOUT;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf[0] = E1000_VF_RESET;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mbx->ops.write_posted(hw, msgbuf, 1, 0);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msec_delay(10);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* set our "perm_addr" based on info provided by PF */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = mbx->ops.read_posted(hw, msgbuf, 3, 0);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!ret_val) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (msgbuf[0] == (E1000_VF_RESET |
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi E1000_VT_MSGTYPE_ACK))
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi memcpy(hw->mac.perm_addr, addr, 6);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi else
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = -E1000_ERR_MAC_INIT;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_init_hw_vf - Inits the HW
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Not much to do here except clear the PF Reset indication if there is one.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_init_hw_vf(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_init_hw_vf");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* attempt to set and restore our mac address */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_rar_set_vf(hw, hw->mac.addr, 0);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_rar_set_vf - set device MAC address
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @addr: pointer to the receive address
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @index receive address array register
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchistatic int e1000_rar_set_vf(struct e1000_hw *hw, u8 *addr,
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi u32 E1000_UNUSEDARG index)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_mbx_info *mbx = &hw->mbx;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 msgbuf[3];
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u8 *msg_addr = (u8 *)(&msgbuf[1]);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi memset(msgbuf, 0, 12);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf[0] = E1000_VF_SET_MAC_ADDR;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi memcpy(msg_addr, addr, 6);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = mbx->ops.write_posted(hw, msgbuf, 3, 0);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = mbx->ops.read_posted(hw, msgbuf, 3, 0);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf[0] &= ~E1000_VT_MSGTYPE_CTS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* if nacked the address was rejected, use "perm_addr" */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!ret_val &&
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi (msgbuf[0] == (E1000_VF_SET_MAC_ADDR | E1000_VT_MSGTYPE_NACK)))
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_read_mac_addr_vf(hw);
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi
c124a83e09115de88ecccd4f689983f42a1d53bdRobert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_hash_mc_addr_vf - Generate a multicast hash value
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @mc_addr: pointer to a multicast address
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Generates a multicast address hash value which is used to determine
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * the multicast filter table array address and new table value.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic u32 e1000_hash_mc_addr_vf(struct e1000_hw *hw, u8 *mc_addr)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 hash_value, hash_mask;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u8 bit_shift = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_hash_mc_addr_generic");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Register count multiplied by bits per register */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hash_mask = (hw->mac.mta_reg_count * 32) - 1;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /*
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * The bit_shift is the number of left-shifts
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * where 0xFF would still fall within the hash mask.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi while (hash_mask >> bit_shift != 0xFF)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi bit_shift++;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hash_value = hash_mask & (((mc_addr[4] >> (8 - bit_shift)) |
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi (((u16) mc_addr[5]) << bit_shift)));
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return hash_value;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic void e1000_write_msg_read_ack(struct e1000_hw *hw,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 *msg, u16 size)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_mbx_info *mbx = &hw->mbx;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 retmsg[E1000_VFMAILBOX_SIZE];
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 retval = mbx->ops.write_posted(hw, msg, size, 0);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!retval)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mbx->ops.read_posted(hw, retmsg, E1000_VFMAILBOX_SIZE, 0);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_update_mc_addr_list_vf - Update Multicast addresses
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @mc_addr_list: array of multicast addresses to program
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @mc_addr_count: number of multicast addresses to program
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Updates the Multicast Table Array.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * The caller must have a packed mc_addr_list of multicast addresses.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchivoid e1000_update_mc_addr_list_vf(struct e1000_hw *hw,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u8 *mc_addr_list, u32 mc_addr_count)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 msgbuf[E1000_VFMAILBOX_SIZE];
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u16 *hash_list = (u16 *)&msgbuf[1];
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 hash_value;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 i;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_update_mc_addr_list_vf");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Each entry in the list uses 1 16 bit word. We have 30
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * 16 bit words available in our HW msg buffer (minus 1 for the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * msg type). That's 30 hash values if we pack 'em right. If
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * there are more than 30 MC addresses to add then punt the
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * extras for now and then add code to handle more than 30 later.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * It would be unusual for a server to request that many multi-cast
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * addresses except for in large enterprise network environments.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT1("MC Addr Count = %d\n", mc_addr_count);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (mc_addr_count > 30) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf[0] |= E1000_VF_SET_MULTICAST_OVERFLOW;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mc_addr_count = 30;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf[0] = E1000_VF_SET_MULTICAST;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf[0] |= mc_addr_count << E1000_VT_MSGINFO_SHIFT;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi for (i = 0; i < mc_addr_count; i++) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hash_value = e1000_hash_mc_addr_vf(hw, mc_addr_list);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGOUT1("Hash value = 0x%03X\n", hash_value);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hash_list[i] = hash_value & 0x0FFF;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mc_addr_list += ETH_ADDR_LEN;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_write_msg_read_ack(hw, msgbuf, E1000_VFMAILBOX_SIZE);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_vfta_set_vf - Set/Unset vlan filter table address
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @vid: determines the vfta register and bit to set/unset
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @set: if TRUE then set bit, else clear bit
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchivoid e1000_vfta_set_vf(struct e1000_hw *hw, u16 vid, bool set)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 msgbuf[2];
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf[0] = E1000_VF_SET_VLAN;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf[1] = vid;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* Setting the 8 bit field MSG INFO to TRUE indicates "add" */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (set)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf[0] |= E1000_VF_SET_VLAN_ADD;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_write_msg_read_ack(hw, msgbuf, 2);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/** e1000_rlpml_set_vf - Set the maximum receive packet length
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @max_size: value to assign to max frame size
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchivoid e1000_rlpml_set_vf(struct e1000_hw *hw, u16 max_size)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 msgbuf[2];
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf[0] = E1000_VF_SET_LPE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf[1] = max_size;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi e1000_write_msg_read_ack(hw, msgbuf, 2);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_promisc_set_vf - Set flags for Unicast or Multicast promisc
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @uni: boolean indicating unicast promisc status
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @multi: boolean indicating multicast promisc status
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchis32 e1000_promisc_set_vf(struct e1000_hw *hw, enum e1000_promisc_type type)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_mbx_info *mbx = &hw->mbx;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 msgbuf = E1000_VF_SET_PROMISC;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi switch (type) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_promisc_multicast:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf |= E1000_VF_SET_PROMISC_MULTICAST;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_promisc_enabled:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf |= E1000_VF_SET_PROMISC_MULTICAST;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_promisc_unicast:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi msgbuf |= E1000_VF_SET_PROMISC_UNICAST;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi case e1000_promisc_disabled:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi break;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi default:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return -E1000_ERR_MAC_INIT;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = mbx->ops.write_posted(hw, &msgbuf, 1, 0);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!ret_val)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = mbx->ops.read_posted(hw, &msgbuf, 1, 0);
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!ret_val && !(msgbuf & E1000_VT_MSGTYPE_ACK))
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = -E1000_ERR_MAC_INIT;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_read_mac_addr_vf - Read device MAC address
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_read_mac_addr_vf(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi int i;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi for (i = 0; i < ETH_ADDR_LEN; i++)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi hw->mac.addr[i] = hw->mac.perm_addr[i];
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi/**
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * e1000_check_for_link_vf - Check for link for a virtual interface
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * @hw: pointer to the HW structure
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi *
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * Checks to see if the underlying PF is still talking to the VF and
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * if it is then it reports the link state to the hardware, otherwise
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * it reports link down and returns an error.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi **/
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchistatic s32 e1000_check_for_link_vf(struct e1000_hw *hw)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi{
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_mbx_info *mbx = &hw->mbx;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi struct e1000_mac_info *mac = &hw->mac;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi s32 ret_val = E1000_SUCCESS;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi u32 in_msg = 0;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi DEBUGFUNC("e1000_check_for_link_vf");
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /*
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * We only want to run this if there has been a rst asserted.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * in this case that could mean a link change, device reset,
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * or a virtual function reset
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* If we were hit with a reset or timeout drop the link */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!mbx->ops.check_for_rst(hw, 0) || !mbx->timeout)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->get_link_status = TRUE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!mac->get_link_status)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi goto out;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* if link status is down no point in checking to see if pf is up */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!(E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_LU))
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi goto out;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* if the read failed it could just be a mailbox collision, best wait
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * until we are called again and don't report an error */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (mbx->ops.read(hw, &in_msg, 1, 0))
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi goto out;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* if incoming message isn't clear to send we are waiting on response */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!(in_msg & E1000_VT_MSGTYPE_CTS)) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* message is not CTS and is NACK we have lost CTS status */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (in_msg & E1000_VT_MSGTYPE_NACK)
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = -E1000_ERR_MAC_INIT;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi goto out;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* at this point we know the PF is talking to us, check and see if
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * we are still accepting timeout or if we had a timeout failure.
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * if we failed then we will need to reinit */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi if (!mbx->timeout) {
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi ret_val = -E1000_ERR_MAC_INIT;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi goto out;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi }
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi /* if we passed all the tests above then the link is up and we no
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi * longer need to check for link */
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi mac->get_link_status = FALSE;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchiout:
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi return ret_val;
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi}
75eba5b6d79ed4d2ce3daf7b2806306b6b69a938Robert Mustacchi