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 *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * History:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * 11/15/01 Hav Khauv Inception.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "lm5710.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "phy_reg.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "license.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "mcp_shmem.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "lm_stats.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#include "577xx_int_offsets.h"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/***********************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* CLC - Common Link Component API */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/***********************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* Driver needs to redefine the cps_cb_st_ptr ( CPS CallBack Struct Pointer ) with its own */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#if defined(ELINK_DEBUG) && !defined(__SunOS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid elink_cb_dbg(struct elink_dev *bp, _In_ char* fmt )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(bp, WARNelink, fmt);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid elink_cb_dbg1(struct elink_dev *bp, _In_ char* fmt, u32 arg1 )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(bp, WARNelink, fmt, arg1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid elink_cb_dbg2(struct elink_dev *bp, _In_ char* fmt, u32 arg1, u32 arg2 )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(bp, WARNelink, fmt, arg1, arg2);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid elink_cb_dbg3(struct elink_dev *bp, _In_ char* fmt, u32 arg1, u32 arg2, u32 arg3 )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(bp, WARNelink, fmt, arg1, arg2, arg3);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif /* ELINK_DEBUG */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32 elink_cb_reg_read(struct elink_dev *cb, u32 reg_addr )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return REG_RD(cb, reg_addr);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid elink_cb_reg_write(struct elink_dev *cb, u32 reg_addr, u32 val )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(cb, reg_addr, val);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* wb_write - pointer to 2 32 bits vars to be passed to the DMAE*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid elink_cb_reg_wb_write(struct elink_dev *cb, u32 offset, u32 *wb_write, u16 len )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR_DMAE_LEN(cb, offset, wb_write, len);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid elink_cb_reg_wb_read(struct elink_dev *cb, u32 offset, u32 *wb_write, u16 len )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_RD_DMAE_LEN(cb, offset, wb_write, len);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/* mode - 0( LOW ) /1(HIGH)*/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8 elink_cb_gpio_write(struct elink_dev *cb, u16 gpio_num, u8 mode, u8 port)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_gpio_write(cb, gpio_num, mode, port);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8 elink_cb_gpio_mult_write(struct elink_dev *cb, u8 pins, u8 mode)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_gpio_mult_write(cb, pins, mode);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32 elink_cb_gpio_read(struct elink_dev *cb, u16 gpio_num, u8 port)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32 val=0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_gpio_read(cb, gpio_num, &val, port);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8 elink_cb_gpio_int_write(struct elink_dev *cb, u16 gpio_num, u8 mode, u8 port)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_gpio_int_write(cb, gpio_num, mode, port);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid elink_cb_udelay(struct elink_dev *cb, u32 microsecond)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define MAX_WAIT_INTERVAL 50
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t wait_itr = (microsecond/MAX_WAIT_INTERVAL) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cnt = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t wait_time = MAX_WAIT_INTERVAL ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( 0 == wait_itr )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi wait_time = microsecond ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi wait_itr = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(cnt = 0; cnt < wait_itr; cnt++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_wait(cb , wait_time );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32 elink_cb_fw_command(struct elink_dev *cb, u32 command, u32 param)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32 fw_resp = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_mcp_cmd_send_recieve(cb, lm_mcp_mb_header, command, param, MCP_CMD_DEFAULT_TIMEOUT,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &fw_resp );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return fw_resp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid elink_cb_download_progress(struct elink_dev *cb, u32 cur, u32 total)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(cb);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(cur);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(total);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifdef DOS
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("Downloaded %u bytes out of %u bytes\n", cur, total );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif // DOS
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid elink_cb_event_log(struct elink_dev *cb, const elink_log_id_t elink_log_id, ...)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi va_list ap;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_log_id_t lm_log_id = LM_LOG_ID_MAX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch( elink_log_id )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_LOG_ID_OVER_CURRENT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_log_id = LM_LOG_ID_OVER_CURRENT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_LOG_ID_PHY_UNINITIALIZED:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_log_id = LM_LOG_ID_PHY_UNINITIALIZED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_LOG_ID_UNQUAL_IO_MODULE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_log_id = LM_LOG_ID_UNQUAL_IO_MODULE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_LOG_ID_MDIO_ACCESS_TIMEOUT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_log_id = LM_LOG_ID_MDIO_ACCESS_TIMEOUT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_LOG_ID_NON_10G_MODULE:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_log_id = LM_LOG_ID_NON_10G_MODULE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(TRUE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } // elink_log_id switch
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi va_start(ap, elink_log_id);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_event_log_generic_arg_fwd( cb, lm_log_id, ap );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi va_end(ap);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu8 elink_cb_path_id(struct elink_dev *cb)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return PATH_ID(cb);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid elink_cb_notify_link_changed(struct elink_dev *cb)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(cb, MISC_REG_AEU_GENERAL_ATTN_12 + FUNC_ID((lm_device_t *)cb)*sizeof(u32), 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*******************************************************************************
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* Macros.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define MII_REG(_type, _field) (OFFSETOF(_type, _field)/2)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define MDIO_INDIRECT_REG_ADDR 0x1f
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define MDIO_SET_REG_BANK(pdev,reg_bank)\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_mwrite(pdev,MDIO_INDIRECT_REG_ADDR, reg_bank)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define MDIO_ACCESS_TIMEOUT 1000
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#define ELINK_STATUS_TO_LM_STATUS(_rc, _lm_status) switch(_rc)\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchicase ELINK_STATUS_OK:\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_status = LM_STATUS_SUCCESS;\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchicase ELINK_STATUS_TIMEOUT:\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_status = LM_STATUS_TIMEOUT;\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchicase ELINK_STATUS_NO_LINK:\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_status = LM_STATUS_LINK_DOWN;\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchicase ELINK_STATUS_ERROR:\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidefault:\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi _lm_status = LM_STATUS_FAILURE;\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;\
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*******************************************************************************
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* Return:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_mwrite( lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t reg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t val)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t tmp;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t port = PORT_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t emac_base = (port?GRCBASE_EMAC1:GRCBASE_EMAC0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pdev,NIG_REG_XGXS0_CTRL_MD_ST + port*0x18, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORM, "lm_mwrite\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(pdev->params.phy_int_mode == PHY_INT_MODE_AUTO_POLLING)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tmp=REG_RD(pdev,emac_base+EMAC_REG_EMAC_MDIO_MODE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tmp &= ~EMAC_MDIO_MODE_AUTO_POLL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pdev,emac_base+EMAC_REG_EMAC_MDIO_MODE,tmp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_wait(pdev, 40);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tmp = (pdev->vars.phy_addr << 21) | (reg << 16) | (val & EMAC_MDIO_COMM_DATA) |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi EMAC_MDIO_COMM_COMMAND_WRITE_22 |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi EMAC_MDIO_COMM_START_BUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pdev,emac_base+EMAC_REG_EMAC_MDIO_COMM,tmp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(cnt = 0; cnt < 1000; cnt++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_wait(pdev, 10);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tmp=REG_RD(pdev,emac_base+EMAC_REG_EMAC_MDIO_COMM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!(tmp & EMAC_MDIO_COMM_START_BUSY))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_wait(pdev, 5);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(tmp & EMAC_MDIO_COMM_START_BUSY)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("Write phy register failed\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(pdev->params.phy_int_mode == PHY_INT_MODE_AUTO_POLLING)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tmp=REG_RD(pdev,emac_base+EMAC_REG_EMAC_MDIO_MODE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tmp |= EMAC_MDIO_MODE_AUTO_POLL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pdev,emac_base+EMAC_REG_EMAC_MDIO_MODE,tmp);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pdev,NIG_REG_XGXS0_CTRL_MD_ST +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi port*0x18, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_mwrite */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*******************************************************************************
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* Return:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_mread( lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t reg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t *ret_val)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t cnt;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t port = PORT_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t emac_base = (port?GRCBASE_EMAC1:GRCBASE_EMAC0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pdev,NIG_REG_XGXS0_CTRL_MD_ST + port*0x18, 1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, INFORM, "lm_mread\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(pdev->params.phy_int_mode == PHY_INT_MODE_AUTO_POLLING)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi val=REG_RD(pdev,emac_base+EMAC_REG_EMAC_MDIO_MODE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi val &= ~EMAC_MDIO_MODE_AUTO_POLL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pdev,emac_base+EMAC_REG_EMAC_MDIO_MODE,val);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_wait(pdev, 40);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi val = (pdev->vars.phy_addr << 21) | (reg << 16) |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi EMAC_MDIO_COMM_COMMAND_READ_22 |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi EMAC_MDIO_COMM_START_BUSY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pdev,emac_base+EMAC_REG_EMAC_MDIO_COMM,val);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for(cnt = 0; cnt < 1000; cnt++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_wait(pdev, 10);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi val=REG_RD(pdev,emac_base+EMAC_REG_EMAC_MDIO_COMM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!(val & EMAC_MDIO_COMM_START_BUSY))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi val &= EMAC_MDIO_COMM_DATA;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(val & EMAC_MDIO_COMM_START_BUSY)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("Read phy register failed\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi val = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *ret_val = val;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(pdev->params.phy_int_mode == PHY_INT_MODE_AUTO_POLLING)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi val=REG_RD(pdev,emac_base+EMAC_REG_EMAC_MDIO_MODE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi val |= EMAC_MDIO_MODE_AUTO_POLL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pdev,emac_base+EMAC_REG_EMAC_MDIO_MODE,val);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pdev,NIG_REG_XGXS0_CTRL_MD_ST +
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi port*0x18, 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_mread */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*******************************************************************************
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* Return:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_phy45_read(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t phy_addr,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t dev_addr,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t reg, // offset
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t *ret_val)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t rc = ELINK_STATUS_OK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = elink_phy_read(&pdev->params.link, phy_addr, dev_addr, reg, ret_val);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_UNLOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_STATUS_TO_LM_STATUS( rc, lm_status );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*******************************************************************************
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi* Return:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_phy45_write(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t phy_addr,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t dev_addr,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t reg, // offset
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t val)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t rc = ELINK_STATUS_OK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi rc = elink_phy_write(&pdev->params.link, phy_addr, dev_addr, reg, val);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_UNLOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_STATUS_TO_LM_STATUS( rc, lm_status );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_set_phy_addr(lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t addr)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (addr > 0x1f)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakMsg("lm_set_phy_addr: error addr not valid\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.phy_addr = addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Function Name: lm_get_speed_real_from_elink_line_speed
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Parameters: IN line speed (from elink)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Returns: "real speed" in mbps units
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t lm_get_speed_real_from_elink_line_speed( IN const struct elink_vars* link_vars )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u16_t line_speed = link_vars->line_speed;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t real_speed = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( !link_vars->link_up )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // probably we get here from ioc_get_driver_info in case of no link
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // we return 0 in that case
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(line_speed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_SPEED_10:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi real_speed = 10;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_SPEED_100:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi real_speed = 100;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_SPEED_1000:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi real_speed = 1000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_SPEED_2500:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi real_speed = 2500;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_SPEED_10000:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi real_speed = 10000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_SPEED_20000:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi real_speed = 20000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return real_speed;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Function Name: lm_get_speed_medium_from_elink_line_speed
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Parameters: IN line speed (from elink)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Returns: "medium" translation to LM units
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t lm_get_speed_medium_from_elink_line_speed( IN const struct elink_vars* link_vars )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u16_t line_speed = link_vars->line_speed;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t medium = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(line_speed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_SPEED_10:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi medium = LM_MEDIUM_SPEED_10MBPS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_SPEED_100:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi medium = LM_MEDIUM_SPEED_100MBPS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_SPEED_1000:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi medium = LM_MEDIUM_SPEED_1000MBPS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_SPEED_2500:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi medium = LM_MEDIUM_SPEED_2500MBPS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_SPEED_10000:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi medium = LM_MEDIUM_SPEED_10GBPS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case ELINK_SPEED_20000:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi medium = LM_MEDIUM_SPEED_20GBPS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return medium;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiu32_t lm_get_port_max_speed(IN struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi static const u32_t PORT_SPEED_10G = 10000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi static const u32_t PORT_SPEED_1G = 1000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t port_default_cfg = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!CHIP_IS_E3(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return PORT_SPEED_10G;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(LM_CHIP_PORT_MODE_4 != CHIP_PORT_MODE(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return PORT_SPEED_10G;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SHMEM_READ(pdev,OFFSETOF(shmem_region_t,dev_info.port_hw_config[PORT_ID(pdev)].default_cfg),&port_default_cfg);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (GET_FLAGS(port_default_cfg, PORT_HW_CFG_NET_SERDES_IF_MASK) == PORT_HW_CFG_NET_SERDES_IF_SGMII)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return PORT_SPEED_1G;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return PORT_SPEED_10G;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Function Name: lm_loopback_req_meduim_convert
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Parameters: IN req_medium as received from upper layer
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Description: convert the req_meduim (recieved from diag driver / BMAPI) to relevant type according to the chip
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * this is a little bit conusing since we override the value recieved by a new value
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * but we need to do it for backward compatbiality.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Returns: "medium" translation to LM units
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_medium_t lm_loopback_req_medium_convert( IN struct _lm_device_t *pdev, IN const lm_medium_t req_medium )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t default_cfg = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_medium_t ret_medium = req_medium;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Assumption bxdiag always send the following for each test type:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // LOOPBACK_TYPE_MAC --> LM_MEDIUM_TYPE_BMAC_LOOPBACK/LM_MEDIUM_TYPE_UMAC_LOOPBACK/LM_MEDIUM_TYPE_XMAC_LOOPBACK (bxdiag 7.0.1 only, never gold...)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // LOOPBACK_TYPE_PHY --> LM_MEDIUM_TYPE_XGXS_10_LOOPBACK
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Here, we'll "translate" the LM_MEDIUM_TYPE_XXX so it will work correctly in BCM578xx
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( CHIP_IS_E3(pdev) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SHMEM_READ(pdev,OFFSETOF(shmem_region_t,dev_info.port_hw_config[PORT_ID(pdev)].default_cfg),&default_cfg);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default_cfg &= PORT_HW_CFG_NET_SERDES_IF_MASK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(req_medium)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // MAC loopback test
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_BMAC_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_UMAC_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_XMAC_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_MAC_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( CHIP_IS_E3(pdev) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( PORT_HW_CFG_NET_SERDES_IF_SGMII == default_cfg )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ret_medium = LM_MEDIUM_TYPE_UMAC_LOOPBACK; //1GB
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ret_medium = LM_MEDIUM_TYPE_XMAC_LOOPBACK; //10GB/20GB
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ret_medium = LM_MEDIUM_TYPE_BMAC_LOOPBACK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // PHY loopback test
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_XGXS_10_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( CHIP_IS_E3(pdev) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(default_cfg)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_HW_CFG_NET_SERDES_IF_SGMII:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ret_medium = LM_MEDIUM_TYPE_XGXS_LOOPBACK; //1GB
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_HW_CFG_NET_SERDES_IF_XFI:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_HW_CFG_NET_SERDES_IF_SFI:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_HW_CFG_NET_SERDES_IF_KR:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ret_medium = LM_MEDIUM_TYPE_XGXS_10_LOOPBACK; //10GB
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_HW_CFG_NET_SERDES_IF_DXGXS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_HW_CFG_NET_SERDES_IF_KR2:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ret_medium = req_medium; //20GB - TBD!! for T7.2
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ret_medium = LM_MEDIUM_TYPE_XGXS_10_LOOPBACK; //10GB
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return ret_medium;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void get_link_params(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t real_speed = 0; // speed in 100M steps
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t medium = 0; // LM_MEDIUM_XXX
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t max_bw_in_Mbps = 0; // In Mbps steps
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t max_bw_in_100Mbps = 0; // In 100Mbps steps
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.cable_is_attached = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.link_status = LM_STATUS_LINK_ACTIVE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(pdev->vars.medium,LM_MEDIUM_SPEED_10GBPS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // link status
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pdev->vars.link.link_up)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.link_status = LM_STATUS_LINK_DOWN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.cable_is_attached = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // if we are in multifunction mode and function is disabled indicate OS link down (unless loopback medium is set)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Note that the CLC link is up so pmf handling is still going on
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_MULTI_VNIC(pdev) && (GET_FLAGS(pdev->hw_info.mf_info.func_mf_cfg, FUNC_MF_CFG_FUNC_DISABLED)) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (!LM_MEDIUM_IS_LOOPBACK(pdev->params.req_medium)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.link_status = LM_STATUS_LINK_DOWN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.cable_is_attached = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //in NIV mode, link_status is modified only from lm_niv_vif_set or from the FUNCTION_UPDATE completion(for loopback)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!IS_MF_AFEX_MODE(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.link_status = LM_STATUS_LINK_ACTIVE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.cable_is_attached = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // get speed
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi real_speed = lm_get_speed_real_from_elink_line_speed(&pdev->vars.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi real_speed = real_speed/100;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi medium = lm_get_speed_medium_from_elink_line_speed(&pdev->vars.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(pdev->vars.medium, medium );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // get duplex
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_DUPLEX(pdev->vars.medium,LM_MEDIUM_FULL_DUPLEX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->vars.link.duplex == DUPLEX_HALF )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_DUPLEX(pdev->vars.medium,LM_MEDIUM_HALF_DUPLEX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // get flow_control
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.flow_control = LM_FLOW_CONTROL_NONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->vars.link.flow_ctrl & ELINK_FLOW_CTRL_RX)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.flow_control |= LM_FLOW_CONTROL_RECEIVE_PAUSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->vars.link.flow_ctrl & ELINK_FLOW_CTRL_TX)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.flow_control |= LM_FLOW_CONTROL_TRANSMIT_PAUSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // get EEE state
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (GET_FLAGS(pdev->vars.link.eee_status,SHMEM_EEE_REQUESTED_BIT))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.autogreeen = LM_AUTOGREEEN_ENABLED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.eee_policy = pdev->vars.link.eee_status & SHMEM_EEE_TIMER_MASK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.autogreeen = LM_AUTOGREEEN_DISABLED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_MULTI_VNIC(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi max_bw_in_Mbps = lm_get_max_bw(pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (real_speed *100),
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi VNIC_ID(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi max_bw_in_100Mbps = max_bw_in_Mbps /100; // In 100Mbps steps
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (real_speed > max_bw_in_100Mbps)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (max_bw_in_100Mbps)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(pdev->vars.medium,(LM_MEDIUM_SPEED_SEQ_START + ((max_bw_in_100Mbps-1)<<8)));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // in case the pdev->params.max_bw[VNIC_ID(pdev)] = 0
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(pdev->vars.medium,LM_MEDIUM_SPEED_SEQ_START);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid sync_link_status(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t func_id = FUNC_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t port_id = PORT_ID(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "sync_link_status: Func %d \n", func_id );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // inform all other port vnics not ourself
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for( i=0; i<4 ;i++ )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (func_id != (i*2 + port_id))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_12 + 4*(i*2 + port_id),0x1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "sync_link_status: send attention to Func %d\n", (i*2 + port_id));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_reset_link(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_reset_link not implemented for VF\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // notify stats
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_on_link_update(pdev, FALSE );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.link_status = LM_STATUS_LINK_DOWN;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.cable_is_attached = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.mac_type = MAC_TYPE_NONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_lfa_reset(&pdev->params.link,&pdev->vars.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_UNLOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Configure cmng the firmware to the right CMNG values if this
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * device is the PMF ,after link speed/ETS changes.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @note This function must be called under PHY_LOCK
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_cmng_update(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t port_speed = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* fairness is only supported for vnics in the meantime... */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((!IS_MULTI_VNIC(pdev)) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (!pdev->vars.link.link_up))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!IS_PMF(pdev) && !IS_MF_AFEX_MODE(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // in case we are not PMF we still want to run this code in AFEX mode.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi port_speed = lm_get_speed_real_from_elink_line_speed(&pdev->vars.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_cmng_init(pdev,port_speed);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_reload_link_and_cmng(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( IS_MULTI_VNIC(pdev) && pdev->hw_info.mcp_detected )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_cmng_get_shmem_info(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_cmng_calc_params(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi get_link_params(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_cmng_update(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_link_fill_reported_data( IN lm_device_t *pdev, OUT lm_reported_link_params_t *lm_reported_link_params )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_reported_link_params->cable_is_attached = pdev->vars.cable_is_attached;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_reported_link_params->link = pdev->vars.link_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_reported_link_params->medium = pdev->vars.medium;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_reported_link_params->flow_ctrl = pdev->vars.flow_control;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_reported_link_params->eee_policy = (u8_t)pdev->vars.eee_policy; // one of PORT_FEAT_CFG_EEE_POWER_MODE_*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// This function is called due to link change attention for none pmf it gets the link status from the shmem
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_link_report(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t pause_ena = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_reported_link_params_t current_link_params = {0};
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t b_indicate = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_reload_link_and_cmng(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // get current link params into current_link_params
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_link_fill_reported_data(pdev, &current_link_params );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Don't report link down again (if it is already down) */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( (LM_STATUS_LINK_DOWN == pdev->vars.last_reported_link_params.link) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (LM_STATUS_LINK_DOWN == current_link_params.link) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi b_indicate = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Don't report exact same link status twice
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ASSERT_STATIC( sizeof(current_link_params) == sizeof(pdev->vars.last_reported_link_params) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi b_indicate = ( FALSE == mm_memcmp( &current_link_params, &pdev->vars.last_reported_link_params, sizeof(current_link_params)) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->vars.link.link_up)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // link up
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // dropless flow control
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PMF(pdev) && pdev->params.l2_fw_flow_ctrl)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->vars.link.flow_ctrl & ELINK_FLOW_CTRL_TX)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pause_ena = 1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_INTMEM_WRITE16(pdev,USTORM_ETH_PAUSE_ENABLED_OFFSET(PORT_ID(pdev)), pause_ena, BAR_USTRORM_INTMEM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.mac_type = pdev->vars.link.mac_type;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(pdev->vars.mac_type >= MAC_TYPE_MAX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // indicate link up - except if we're in NIV mode where we wait for the VIF-SET/enable command from the MCP.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( IS_MF_AFEX_MODE(pdev) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi b_indicate = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // indicate link up
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_indicate )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_indicate_link(pdev, pdev->vars.link_status, pdev->vars.medium);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_link_update: indicate link %d 0x%x \n",pdev->vars.link_status,pdev->vars.medium);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // notify stats
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_on_link_update(pdev, TRUE );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi { // link down
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // indicate link down
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.mac_type = MAC_TYPE_NONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.stats.stats_collect.stats_hw.b_is_link_up = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // indicate link down
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_indicate )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_indicate_link(pdev, pdev->vars.link_status, pdev->vars.medium);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_link_update: indicate link %d 0x%x \n",pdev->vars.link_status,pdev->vars.medium);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // notify othres funcs
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_MULTI_VNIC(pdev) && IS_PMF(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sync_link_status(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// This function is called due to link change interrupt for the relevant function
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi// NOTE: this function must be called under phy lock
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_link_update(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL( pdev )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // notify stats
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_stats_on_link_update(pdev, FALSE );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( pdev->params.i2c_interval_sec )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.i2c_elink_status[I2C_SECTION_A0] = ELINK_STATUS_INVALID_IMAGE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.i2c_elink_status[I2C_SECTION_A2] = ELINK_STATUS_INVALID_IMAGE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_link_update(&pdev->params.link,&pdev->vars.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_UNLOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_link_report(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // increment link_chng_cnt counter to indicate there was some link change.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->vars.link_chng_cnt++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_set_phy_selection( lm_device_t *pdev, u8_t i)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32 phy_sel ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.link.multi_phy_config & PORT_HW_CFG_PHY_SWAPPED_ENABLED)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phy_sel = PORT_HW_CFG_PHY_SELECTION_SECOND_PHY - (i - ELINK_EXT_PHY1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phy_sel = PORT_HW_CFG_PHY_SELECTION_FIRST_PHY + (i - ELINK_EXT_PHY1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RESET_FLAGS( pdev->params.link.multi_phy_config, PORT_HW_CFG_PHY_SELECTION_MASK );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS( pdev->params.link.multi_phy_config, phy_sel);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatic void lm_set_phy_priority_selection( lm_device_t *pdev, u8_t i)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32 phy_sel;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.link.multi_phy_config & PORT_HW_CFG_PHY_SWAPPED_ENABLED)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phy_sel = PORT_HW_CFG_PHY_SELECTION_SECOND_PHY_PRIORITY - (i - ELINK_EXT_PHY1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi phy_sel = PORT_HW_CFG_PHY_SELECTION_FIRST_PHY_PRIORITY + (i - ELINK_EXT_PHY1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RESET_FLAGS( pdev->params.link.multi_phy_config, PORT_HW_CFG_PHY_SELECTION_MASK );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS( pdev->params.link.multi_phy_config, phy_sel);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*******************************************************************************
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Return:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiSTATIC
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_set_phy_priority_mode(lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHK_NULL(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (pdev->params.phy_priority_mode)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PHY_PRIORITY_MODE_HW_DEF:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RESET_FLAGS( pdev->params.link.multi_phy_config, PORT_HW_CFG_PHY_SELECTION_MASK );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS( pdev->params.link.multi_phy_config, pdev->hw_info.multi_phy_config);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PHY_PRIORITY_MODE_10GBASET:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i = ELINK_EXT_PHY1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (i < ELINK_MAX_PHYS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.link.phy[i].media_type == ELINK_ETH_PHY_BASE_T)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_phy_priority_selection(pdev, i);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PHY_PRIORITY_MODE_SERDES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i = ELINK_EXT_PHY1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (i < ELINK_MAX_PHYS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pdev->params.link.phy[i].media_type == ELINK_ETH_PHY_SFPP_10G_FIBER) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pdev->params.link.phy[i].media_type == ELINK_ETH_PHY_SFP_1G_FIBER) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pdev->params.link.phy[i].media_type == ELINK_ETH_PHY_XFP_FIBER) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pdev->params.link.phy[i].media_type == ELINK_ETH_PHY_DA_TWINAX) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pdev->params.link.phy[i].media_type == ELINK_ETH_PHY_NOT_PRESENT))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_phy_priority_selection(pdev, i);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PHY_PRIORITY_MODE_HW_PIN:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RESET_FLAGS( pdev->params.link.multi_phy_config, PORT_HW_CFG_PHY_SELECTION_MASK );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS( pdev->params.link.multi_phy_config, PORT_HW_CFG_PHY_SELECTION_HARDWARE_DEFAULT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*******************************************************************************
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Return:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiSTATIC
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_set_phy_link_params(lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_medium_t req_medium,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_flow_control_t flow_control,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t sw_config,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t phy_num)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_medium_t speed = GET_MEDIUM_SPEED(req_medium);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_medium_t duplex = GET_MEDIUM_DUPLEX(req_medium);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_set_phy_link_params: speed 0x%x\n",speed);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Get speed from shared memory not registry - if mcp is detected...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(pdev->hw_info.mcp_detected && ((speed == LM_MEDIUM_SPEED_HARDWARE_DEFAULT) || (IS_MULTI_VNIC(pdev))))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_init_phy: pdev->hw_info.link_config[phy_num] = 0x%x\n",pdev->hw_info.link_config[phy_num]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch(pdev->hw_info.link_config[phy_num] & PORT_FEATURE_LINK_SPEED_MASK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEATURE_LINK_SPEED_10M_FULL:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(speed,LM_MEDIUM_SPEED_10MBPS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_DUPLEX(duplex,LM_MEDIUM_FULL_DUPLEX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEATURE_LINK_SPEED_10M_HALF:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(speed,LM_MEDIUM_SPEED_10MBPS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_DUPLEX(duplex,LM_MEDIUM_HALF_DUPLEX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEATURE_LINK_SPEED_100M_FULL:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(speed,LM_MEDIUM_SPEED_100MBPS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_DUPLEX(duplex,LM_MEDIUM_FULL_DUPLEX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEATURE_LINK_SPEED_100M_HALF:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(speed,LM_MEDIUM_SPEED_100MBPS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_DUPLEX(duplex,LM_MEDIUM_HALF_DUPLEX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEATURE_LINK_SPEED_1G:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(speed,LM_MEDIUM_SPEED_1000MBPS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_DUPLEX(duplex,LM_MEDIUM_FULL_DUPLEX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEATURE_LINK_SPEED_2_5G:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(speed,LM_MEDIUM_SPEED_2500MBPS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_DUPLEX(duplex,LM_MEDIUM_FULL_DUPLEX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEATURE_LINK_SPEED_10G_CX4:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(speed,LM_MEDIUM_SPEED_10GBPS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_DUPLEX(duplex,LM_MEDIUM_FULL_DUPLEX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEATURE_LINK_SPEED_20G:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(speed,LM_MEDIUM_SPEED_20GBPS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_DUPLEX(duplex,LM_MEDIUM_FULL_DUPLEX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_FEATURE_LINK_SPEED_AUTO:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(speed,LM_MEDIUM_SPEED_AUTONEG);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_DUPLEX(duplex,LM_MEDIUM_FULL_DUPLEX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //Follow Teton solution:We need to do this because Microsoft's definition
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // is not complete, like speed 2.5gb or some other speeds.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_SPEED(speed,LM_MEDIUM_SPEED_AUTONEG);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_DUPLEX(duplex,LM_MEDIUM_FULL_DUPLEX);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_set_phy_link_params: speed 0x%x duplex 0x%x\n",speed,duplex);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_duplex[phy_num] = DUPLEX_FULL;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( duplex == LM_MEDIUM_HALF_DUPLEX)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_duplex[phy_num] = DUPLEX_HALF;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (speed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_AUTONEG:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_line_speed[phy_num] = ELINK_SPEED_AUTO_NEG;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_10MBPS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_line_speed[phy_num] = ELINK_SPEED_10;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_100MBPS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_line_speed[phy_num] = ELINK_SPEED_100;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_1000MBPS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_line_speed[phy_num] = ELINK_SPEED_1000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_2500MBPS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_line_speed[phy_num] = ELINK_SPEED_2500;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_10GBPS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_line_speed[phy_num] = ELINK_SPEED_10000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_20GBPS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_line_speed[phy_num] = ELINK_SPEED_20000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!DBG_BREAK_ON(UNDER_TEST));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_flow_ctrl[phy_num] = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (flow_control == LM_FLOW_CONTROL_NONE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_flow_ctrl[phy_num] = ELINK_FLOW_CTRL_NONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (flow_control & LM_FLOW_CONTROL_AUTO_PAUSE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_flow_ctrl[phy_num] = ELINK_FLOW_CTRL_AUTO;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Under flow control reporting mode we */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((speed == LM_MEDIUM_SPEED_AUTONEG) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pdev->params.flow_control_reporting_mode == LM_FLOW_CONTROL_REPORTING_MODE_ENABLED))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_flow_ctrl[phy_num] = ELINK_FLOW_CTRL_AUTO;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (flow_control & LM_FLOW_CONTROL_RECEIVE_PAUSE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_flow_ctrl[phy_num] |= ELINK_FLOW_CTRL_RX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (flow_control & LM_FLOW_CONTROL_TRANSMIT_PAUSE)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_flow_ctrl[phy_num] |= ELINK_FLOW_CTRL_TX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * this function sets the flow control auto negotiation
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * advertise parameter.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param flow_control
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchivoid lm_set_fc_auto_adv_params(lm_device_t * pdev, lm_flow_control_t flow_control)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u16_t req_fc_auto_adv = ELINK_FLOW_CTRL_BOTH;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t mtu_above_thr = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t report_mode_tx_only = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* There are two cases where we will set flow control auto adv to TX only.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * 1. Has to do with a bug in E1/E1x in which we can't support rx flow control if mtu is larger than
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * a certain threshold. (mtu_above_th)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * 2. cq CQ57772, required only under special registry key, in which we want the flow control displayed
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * in gui (i.e. received by ioctl) to show the resolved flow control (after auto negotiation) and not
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * the requested flow control (in case forced force control is used). For this purpose, if we're in auto-neg
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * and a forced flow control was requested, we set the request flow control to auto (later on in set_link_parameters)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * if forced TX is requested, we se the adv to tx only..(report_mode_tx_only)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mtu_above_thr = CHIP_IS_E1x(pdev) && !IS_MULTI_VNIC(pdev) && (pdev->params.mtu_max > LM_MTU_FLOW_CTRL_TX_THR);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi report_mode_tx_only = (pdev->params.flow_control_reporting_mode == LM_FLOW_CONTROL_REPORTING_MODE_ENABLED) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (flow_control == LM_FLOW_CONTROL_TRANSMIT_PAUSE);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (mtu_above_thr || report_mode_tx_only)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi req_fc_auto_adv = ELINK_FLOW_CTRL_TX;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_fc_auto_adv = req_fc_auto_adv;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*******************************************************************************
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Return:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ******************************************************************************/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_init_phy( lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_medium_t req_medium,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_flow_control_t flow_control,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t selective_autoneg,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t wire_speed,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t wait_link_timeout_us)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t i = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t sw_config = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t elink_status = ELINK_STATUS_OK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_medium_t speed = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_medium_t type = GET_MEDIUM_TYPE(req_medium);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi struct elink_params *link = &pdev->params.link;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi iscsi_info_block_hdr_t iscsi_info_block_hdr = {0} ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(wait_link_timeout_us);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(wire_speed);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi UNREFERENCED_PARAMETER_(selective_autoneg);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi //fill clc params
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if CHK_NULL( pdev )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!pdev) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // override preemphasis for specific svid/ssid
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( 0x1120 == pdev->hw_info.svid )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (pdev->hw_info.ssid)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x4f70:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case 0x4375:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( pdev->params.preemphasis_enable )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // The relevant ssids are from SINGLE_MEDIA board type, so only EXT_PHY1 needs to be set.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(pdev->params.link.feature_config_flags, ELINK_FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.phy[ELINK_EXT_PHY1].rx_preemphasis[0] = (u16_t)pdev->params.preemphasis_rx_0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.phy[ELINK_EXT_PHY1].rx_preemphasis[1] = (u16_t)pdev->params.preemphasis_rx_1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.phy[ELINK_EXT_PHY1].rx_preemphasis[2] = (u16_t)pdev->params.preemphasis_rx_2;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.phy[ELINK_EXT_PHY1].rx_preemphasis[3] = (u16_t)pdev->params.preemphasis_rx_3;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.phy[ELINK_EXT_PHY1].tx_preemphasis[0] = (u16_t)pdev->params.preemphasis_tx_0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.phy[ELINK_EXT_PHY1].tx_preemphasis[1] = (u16_t)pdev->params.preemphasis_tx_1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.phy[ELINK_EXT_PHY1].tx_preemphasis[2] = (u16_t)pdev->params.preemphasis_tx_2;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.phy[ELINK_EXT_PHY1].tx_preemphasis[3] = (u16_t)pdev->params.preemphasis_tx_3;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Set req_fc_auto_adv */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_fc_auto_adv_params(pdev, flow_control);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for (i = 0 ; i < 6 ; i++)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.mac_addr[i] = pdev->params.mac_addr[i];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sw_config = (u8_t)pdev->params.sw_config;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_init_phy: sw_config 0x%x\n",sw_config);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (LM_SWCFG_HW_DEF == sw_config )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_IS_E1x(pdev) || CHIP_IS_E2(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sw_config = (u8_t)(pdev->params.link.switch_cfg>>PORT_FEATURE_CONNECTED_SWITCH_SHIFT);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sw_config = LM_SWCFG_10G;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_init_phy: sw_config 0x%x\n",sw_config);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifndef EDIAG
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch( pdev->params.autogreeen )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_AUTOGREEEN_NVRAM:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Use whatever is configured in the NVRAM
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_AUTOGREEEN_DISABLED:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RESET_FLAGS(pdev->params.link.feature_config_flags, ELINK_FEATURE_CONFIG_AUTOGREEEN_ENABLED );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RESET_FLAGS(pdev->params.link.eee_mode, // no EEE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_EEE_MODE_ENABLE_LPI |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_EEE_MODE_ADV_LPI);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_AUTOGREEEN_ENABLED:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(pdev->params.link.feature_config_flags, ELINK_FEATURE_CONFIG_AUTOGREEEN_ENABLED );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RESET_FLAGS(pdev->params.link.eee_mode, ELINK_EEE_MODE_OVERRIDE_NVRAM);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi RESET_FLAGS(pdev->params.link.eee_mode, ELINK_EEE_MODE_NVRAM_MASK);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (pdev->params.eee_policy)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_EEE_CONTROL_HIGH: // enable EEE mode, advertise "AGGRESSIVE" (Registry: MaxPowerSave)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(pdev->params.link.eee_mode,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_EEE_MODE_OVERRIDE_NVRAM |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_EEE_MODE_ADV_LPI |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_EEE_MODE_ENABLE_LPI |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PORT_FEAT_CFG_EEE_POWER_MODE_AGGRESSIVE );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_EEE_CONTROL_MED: // enable EEE mode, advertise "BALANCED" (Registry: Balance)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(pdev->params.link.eee_mode,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_EEE_MODE_OVERRIDE_NVRAM |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_EEE_MODE_ADV_LPI |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_EEE_MODE_ENABLE_LPI |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PORT_FEAT_CFG_EEE_POWER_MODE_BALANCED);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_EEE_CONTROL_LOW: // enable EEE mode, advertise "LOW_LATENCY" (Registry: MaxPerformace)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(pdev->params.link.eee_mode,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_EEE_MODE_OVERRIDE_NVRAM |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_EEE_MODE_ADV_LPI |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_EEE_MODE_ENABLE_LPI |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PORT_FEAT_CFG_EEE_POWER_MODE_LOW_LATENCY);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_EEE_CONTROL_NVRAM: // use NVRAM value
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(pdev->params.link.eee_mode,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_EEE_MODE_ENABLE_LPI |
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_EEE_MODE_ADV_LPI);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // break here if illegal value was read from registry (CHK version only).
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(1); // unknown value
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_init_phy: autogreeen 0x%x\n", pdev->params.autogreeen);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (sw_config)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // TODO change to shmem defines
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_SWCFG_1G:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_TYPE(pdev->vars.medium, LM_MEDIUM_TYPE_SERDES);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_SWCFG_10G:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_TYPE(pdev->vars.medium, LM_MEDIUM_TYPE_XGXS);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Override setting if dual media and phy type specified from miniport
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((ELINK_DUAL_MEDIA(link)) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ((type == LM_MEDIUM_TYPE_SERDES) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (type == LM_MEDIUM_TYPE_XGXS)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_MEDIUM_TYPE(pdev->vars.medium, type);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = lm_set_phy_link_params(pdev, req_medium, flow_control, sw_config, ELINK_INT_PHY);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (LM_STATUS_SUCCESS == lm_status) {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ELINK_DUAL_MEDIA(link))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_phy_link_params(pdev, req_medium, flow_control, sw_config, ELINK_EXT_PHY1);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } else {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* If 10G is requested and it is blocked on this KR, issue event log */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( pdev->hw_info.no_10g_kr )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi speed = GET_MEDIUM_SPEED(req_medium);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_MEDIUM_SPEED_10GBPS == speed )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_init_phy: 10gb speed parameter is blocked 0x%x\n",speed);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // block this request (elink does not support it) & log
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_event_log_generic(pdev, LM_LOG_ID_NO_10G_SUPPORT, PORT_ID(pdev) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (type)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_XGXS_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.loopback_mode = ELINK_LOOPBACK_XGXS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_line_speed[0] = ELINK_SPEED_1000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_XGXS_10_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.loopback_mode = ELINK_LOOPBACK_XGXS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // for bacs PHY loopback test set speed to 10G.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Otherwise do not overwrite the speed
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!pdev->params.link.req_line_speed[0])
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.link.speed_cap_mask[0] & PORT_HW_CFG_SPEED_CAPABILITY2_D0_20G)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_line_speed[0] = ELINK_SPEED_20000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_line_speed[0] = ELINK_SPEED_10000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_EMAC_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.loopback_mode = ELINK_LOOPBACK_EMAC;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_BMAC_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.loopback_mode = ELINK_LOOPBACK_BMAC;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_EXT_PHY_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.loopback_mode = ELINK_LOOPBACK_EXT_PHY;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.link.speed_cap_mask[0] & PORT_HW_CFG_SPEED_CAPABILITY2_D0_20G)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_line_speed[0] = ELINK_SPEED_20000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else if (pdev->params.link.speed_cap_mask[0] & PORT_HW_CFG_SPEED_CAPABILITY2_D0_10G)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_line_speed[0] = ELINK_SPEED_10000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.req_line_speed[0] = ELINK_SPEED_1000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // TBD: Dual Media ext PHY loopback test for second ext PHY ?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_EXT_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.loopback_mode = ELINK_LOOPBACK_EXT;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_XMAC_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.loopback_mode = ELINK_LOOPBACK_XMAC;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_UMAC_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.loopback_mode = ELINK_LOOPBACK_UMAC;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.link.loopback_mode = ELINK_LOOPBACK_NONE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Handle dual media boards, if phy type specified from miniport
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (ELINK_DUAL_MEDIA(link))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (type)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_SERDES:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i = ELINK_EXT_PHY1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (i < ELINK_MAX_PHYS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pdev->params.link.phy[i].media_type == ELINK_ETH_PHY_SFPP_10G_FIBER) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pdev->params.link.phy[i].media_type == ELINK_ETH_PHY_SFP_1G_FIBER) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pdev->params.link.phy[i].media_type == ELINK_ETH_PHY_XFP_FIBER) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pdev->params.link.phy[i].media_type == ELINK_ETH_PHY_DA_TWINAX))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_phy_selection(pdev, i);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_XGXS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i = ELINK_EXT_PHY1;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi while (i < ELINK_MAX_PHYS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ((pdev->params.link.phy[i].media_type == ELINK_ETH_PHY_BASE_T))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_phy_selection(pdev, i);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi i++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_AUTO_DETECT:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_set_phy_priority_mode(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_XGXS_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_XGXS_10_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_EMAC_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_BMAC_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_EXT_PHY_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_EXT_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_XMAC_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_TYPE_UMAC_LOOPBACK:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Do nothing.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreak();
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_init_phy: loopback_mode 0x%x\n",pdev->params.link.loopback_mode);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PMF(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( pdev->params.i2c_interval_sec )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.i2c_elink_status[I2C_SECTION_A0] = ELINK_STATUS_INVALID_IMAGE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.i2c_elink_status[I2C_SECTION_A2] = ELINK_STATUS_INVALID_IMAGE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (lm_get_iscsi_boot_info_block(pdev,&iscsi_info_block_hdr) == LM_STATUS_SUCCESS)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (iscsi_info_block_hdr.boot_flags & BOOT_INFO_FLAGS_UEFI_BOOT)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi SET_FLAGS(pdev->params.link.feature_config_flags,ELINK_FEATURE_CONFIG_BOOT_FROM_SAN);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_status = elink_phy_init(&pdev->params.link,&pdev->vars.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_UNLOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_link_status_update(&pdev->params.link,&pdev->vars.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Emulation FPGA or LOOPBACK non pmf in multi vnic mode link might be up now
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_link_report(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_init_phy */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifndef EDIAG
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * \brief query i2c information if exists and write it to 3rd party known place
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * \param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * \return lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_link_i2c_update(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_status_t elink_status = ELINK_STATUS_ERROR;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t ext_phy_type = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u64_t current_ts = mm_query_system_time(); // get current system time ms
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u64_t current_ms = current_ts/10000; // get current system time ms
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u64_t interval_ms = pdev->params.i2c_interval_sec*1000;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u64_t delta_ms = current_ms - (pdev->i2c_binary_info.last_query_ts/10000);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi const u8_t b_need_refresh = ( interval_ms > 0 ) && ( delta_ms > interval_ms );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t sff8472_comp = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t diag_type = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(!IS_PMF(pdev));
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( !b_need_refresh )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // that means we need nothing here...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Check which PHY controls the SFP+ module
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi for( ext_phy_type = ELINK_EXT_PHY1; ext_phy_type < pdev->params.link.num_phys; ext_phy_type++ )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(( ELINK_ETH_PHY_SFPP_10G_FIBER == pdev->params.link.phy[ext_phy_type].media_type )||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ( ELINK_ETH_PHY_SFP_1G_FIBER == pdev->params.link.phy[ext_phy_type].media_type )||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ( ELINK_ETH_PHY_DA_TWINAX == pdev->params.link.phy[ext_phy_type].media_type ))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->i2c_binary_info.last_query_ts = current_ts;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Capture A0 section + static part of A2 section only once if A2 is supportd
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (( pdev->params.i2c_elink_status[I2C_SECTION_A0] != ELINK_STATUS_OK) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ((pdev->params.i2c_elink_status[I2C_SECTION_A2] != ELINK_STATUS_OK) &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (pdev->params.i2c_elink_status[I2C_SECTION_A2] != ELINK_OP_NOT_SUPPORTED)))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_status = elink_read_sfp_module_eeprom( &pdev->params.link.phy[ext_phy_type], // ELINK_INT_PHY, ELINK_EXT_PHY1, ELINK_EXT_PHY2
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->params.link,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_I2C_DEV_ADDR_A0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi 0,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi I2C_BINARY_SIZE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->i2c_binary_info.ax_data[I2C_SECTION_A0] ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.i2c_elink_status[I2C_SECTION_A0] = elink_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.i2c_elink_status[I2C_SECTION_A0] != ELINK_STATUS_OK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_UNLOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Set same status to A2 section and quit as A0 is mandatory
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.i2c_elink_status[I2C_SECTION_A2] = elink_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break; // Quit the loop
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Check if the module is compliant with SFF8472, meaning it supports A2 section.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sff8472_comp = pdev->i2c_binary_info.ax_data[I2C_SECTION_A0][ELINK_SFP_EEPROM_SFF_8472_COMP_ADDR];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi diag_type = pdev->i2c_binary_info.ax_data[I2C_SECTION_A0][ELINK_SFP_EEPROM_DIAG_TYPE_ADDR];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( (!sff8472_comp) ||
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ( diag_type & ELINK_SFP_EEPROM_DIAG_ADDR_CHANGE_REQ) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Release the HW LOCK
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_UNLOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Set A2 section query status to NOT SUPPORTED and quit
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.i2c_elink_status[I2C_SECTION_A2] = ELINK_OP_NOT_SUPPORTED;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Exit loop
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_status = elink_read_sfp_module_eeprom( &pdev->params.link.phy[ext_phy_type], // ELINK_INT_PHY, ELINK_EXT_PHY1, ELINK_EXT_PHY2
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->params.link,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_I2C_DEV_ADDR_A2,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi I2C_A2_STATIC_OFFSET,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi I2C_A2_STATIC_SIZE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->i2c_binary_info.ax_data[I2C_SECTION_A2][I2C_A2_STATIC_OFFSET] ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_UNLOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.i2c_elink_status[I2C_SECTION_A2] = elink_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.i2c_elink_status[I2C_SECTION_A2] != ELINK_STATUS_OK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break; // no use continue if we didn't get A2 data
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } // !ELINK_STATUS_OK
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* Avoid reading A2 section if the module doesn't support SFF8472. */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (pdev->params.i2c_elink_status[I2C_SECTION_A2] == ELINK_OP_NOT_SUPPORTED)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Capture the dynamic part of A2
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_status = elink_read_sfp_module_eeprom( &pdev->params.link.phy[ext_phy_type], // ELINK_INT_PHY, ELINK_EXT_PHY1, ELINK_EXT_PHY2
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->params.link,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_I2C_DEV_ADDR_A2,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi I2C_A2_DYNAMIC_OFFSET,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi I2C_A2_DYNAMIC_SIZE,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi &pdev->i2c_binary_info.ax_data[I2C_SECTION_A2][I2C_A2_DYNAMIC_OFFSET] );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_UNLOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Calculate and validate I2C section checksum
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( ELINK_STATUS_OK == elink_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_status = elink_validate_cc_dmi(pdev->i2c_binary_info.ax_data[I2C_SECTION_A2]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( ELINK_STATUS_OK != elink_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->params.i2c_elink_status[I2C_SECTION_A2] = ELINK_STATUS_INVALID_IMAGE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // only one sfp+ module is expected on board so we exit the ext_phy_type loop
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } // if( ELINK_ETH_PHY_SFPP_10G_FIBER == ...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } // for "ext_phy_type"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // it means that there is a need to write otherwise we even didn't enter the loop
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // so the registry write is redundent.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( current_ts == pdev->i2c_binary_info.last_query_ts )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = mm_i2c_update(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi} /* lm_link_i2c_update */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/**
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @Description
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * This function is called periodically, every time the link
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * timer expires, it's main purpose is to call elink under
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * appropriate locks to perform any periodic tasks
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @assumptions:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * called under UM_PHY_LOCK!
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @param pdev
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * @return lm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_link_on_timer(struct _lm_device_t *pdev)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (CHIP_REV_IS_SLOW(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_PMF(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_period_func(&pdev->params.link, &pdev->vars.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_UNLOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#ifndef EDIAG
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_link_i2c_update(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#endif
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Function Name:lm_get_external_phy_fw_version
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Parameters:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi * Funciton should be called under PHY_LOCK
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_get_external_phy_fw_version( lm_device_t *pdev,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t * sz_version,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t len )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t elink_status = ELINK_STATUS_OK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if ( CHK_NULL( sz_version ) || CHK_NULL( pdev ) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // reset the returned value to zero
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *sz_version = '\0';
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_status = elink_get_ext_phy_fw_version(&pdev->params.link, (u8_t *)sz_version, len );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (elink_status == ELINK_STATUS_OK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Update internal hw_info structure for debugging purpose
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( len <= sizeof(pdev->hw_info.sz_ext_phy_fw_ver) )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_memcpy( pdev->hw_info.sz_ext_phy_fw_ver,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi sz_version,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi min( (u32_t)sizeof(pdev->hw_info.sz_ext_phy_fw_ver), (u32_t)len) ) ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi else
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_FAILURE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Function Name:lm_update_external_phy_fw_prepare
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Parameters:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_update_external_phy_fw_prepare( lm_device_t *pdev )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t elink_status = ELINK_STATUS_OK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_PHY_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi do
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u32_t shmem_base[MAX_PATH_NUM], shmem_base2[MAX_PATH_NUM];
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi shmem_base[0] = pdev->hw_info.shmem_base;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi shmem_base2[0] = pdev->hw_info.shmem_base2;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (!CHIP_IS_E1x(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SHMEM2_READ(pdev, OFFSETOF(shmem2_region_t,other_shmem_base_addr), &shmem_base[1]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi LM_SHMEM2_READ(pdev, OFFSETOF(shmem2_region_t,other_shmem2_base_addr), &shmem_base2[1]);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_common_init_phy(pdev, shmem_base, shmem_base2, CHIP_ID(pdev), 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_pre_init_phy(pdev, shmem_base[0], shmem_base2[0], CHIP_ID(pdev), 0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( ELINK_STATUS_OK != elink_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_status = elink_phy_init(&pdev->params.link,&pdev->vars.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( ELINK_STATUS_OK != elink_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_status = elink_link_reset(&pdev->params.link,&pdev->vars.link,0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi } while(0);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_UNLOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_link_report(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_PHY_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( ELINK_STATUS_OK != elink_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi goto _exit;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch( pdev->params.link.phy[ELINK_EXT_PHY1].type )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_gpio_write(pdev, MISC_REGISTERS_GPIO_0, MISC_REGISTERS_GPIO_HIGH, PORT_ID(pdev) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi_exit:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_STATUS_TO_LM_STATUS( elink_status, lm_status );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Function Name:lm_update_external_phy_fw_reinit
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Parameters:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_update_external_phy_fw_reinit( lm_device_t *pdev )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t elink_status = ELINK_STATUS_OK;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_PHY_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_reset_link(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_status = elink_phy_init(&pdev->params.link,&pdev->vars.link);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_UNLOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgBreakIf(ELINK_STATUS_OK != elink_status);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Emulation FPGA or LOOPBACK non pmf in multi vnic mode link might be up now
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_link_report(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ELINK_STATUS_TO_LM_STATUS( elink_status, lm_status );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( LM_STATUS_SUCCESS == lm_status )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // in case success -reset version
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi pdev->hw_info.sz_ext_phy_fw_ver[0] = '\0';
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_PHY_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/*
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Function Name:lm_update_external_phy_fw_done
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Parameters:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Description:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *Returns:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi *
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_update_external_phy_fw_done( lm_device_t *pdev )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t ext_phy_addr = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi u8_t b_exit = FALSE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_ACQUIRE_PHY_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch( pdev->params.link.phy[ELINK_EXT_PHY1].type )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi b_exit = TRUE;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if( b_exit )
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_PHY_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status ;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ext_phy_addr = pdev->params.link.phy[ELINK_EXT_PHY1].addr;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* DSP Remove Download Mode */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_gpio_write(pdev, MISC_REGISTERS_GPIO_0, MISC_REGISTERS_GPIO_LOW, PORT_ID(pdev) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_sfx7101_sp_sw_reset(pdev, &pdev->params.link.phy[ELINK_EXT_PHY1] );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi /* wait 0.5 sec to allow it to run */
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_wait( pdev, 500000);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi elink_ext_phy_hw_reset( pdev, PORT_ID(pdev) );
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi mm_wait(pdev, 500000);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PHY_HW_UNLOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi MM_RELEASE_PHY_LOCK(pdev);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilm_status_t lm_check_phy_link_params(lm_device_t *pdev, lm_medium_t req_medium)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_medium_t speed = GET_MEDIUM_SPEED(req_medium);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if (IS_VFDEV(pdev))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return LM_STATUS_SUCCESS;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, WARN, "lm_check_phy_link_params: speed 0x%x\n",speed);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi // Get speed from registry not shared memory - if mcp is not detected...
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi if(!pdev->hw_info.mcp_detected || ((speed != LM_MEDIUM_SPEED_HARDWARE_DEFAULT) && (!IS_MULTI_VNIC(pdev))))
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi switch (speed)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi {
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_AUTONEG:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_10MBPS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_100MBPS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_1000MBPS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_2500MBPS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_10GBPS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi case LM_MEDIUM_SPEED_20GBPS:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi break;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi default:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi DbgMessage(pdev, FATAL, "lm_check_phy_link_params: abnormal speed parameter 0x%x.\n",speed);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi lm_status = LM_STATUS_INVALID_PARAMETER;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi }
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi return lm_status;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi