/*
 * Copyright (c) 2018, 2020-2021, The Linux Foundation. All rights reserved.
 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all copies.
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
/*qca808x_start*/
#include "sw.h"
#include "fal_port_ctrl.h"
#include "hsl_api.h"
#include "hsl.h"
#include "hsl_phy.h"
#include "ssdk_plat.h"
#include "qca808x_phy.h"
/*qca808x_end*/
#if defined(IN_PTP)
#include "qca808x_ptp.h"
#endif
#include "qca808x.h"
#ifdef IN_LED
#include "qca808x_led.h"
#endif

static a_bool_t phy_dev_drv_init_flag = A_FALSE;
/*qca808x_start*/
static a_bool_t phy_ops_flag = A_FALSE;

static struct mutex qca808x_reg_lock;

#define QCA808X_LOCKER_INIT		mutex_init(&qca808x_reg_lock)
#define QCA808X_REG_LOCK		mutex_lock(&qca808x_reg_lock)
#define QCA808X_REG_UNLOCK		mutex_unlock(&qca808x_reg_lock)

/******************************************************************************
*
* qca808x_phy_mii_read - mii register read
*
* mii register read
*/
a_uint16_t
qca808x_phy_reg_read(a_uint32_t dev_id, a_uint32_t phy_id, a_uint32_t reg_id)
{
	sw_error_t rv = SW_OK;
	a_uint16_t phy_data = 0;
#if defined(IN_PHY_I2C_MODE)
	a_uint32_t port_id = qca_ssdk_phy_addr_to_port(dev_id, phy_id);
	a_uint8_t phy_access_type = hsl_port_phy_access_type_get(dev_id, port_id);

	if (phy_access_type == PHY_I2C_ACCESS) {
		HSL_PHY_I2C_GET(rv, dev_id, phy_id, reg_id, &phy_data);
	}
	else
#endif
	{
		HSL_PHY_GET(rv, dev_id, phy_id, reg_id, &phy_data);
	}

	if (rv != SW_OK) {
		return PHY_INVALID_DATA;
	}

	return phy_data;
}

/******************************************************************************
*
* qca808x_phy_mii_write - mii register write
*
* mii register write
*/
sw_error_t
qca808x_phy_reg_write(a_uint32_t dev_id, a_uint32_t phy_id, a_uint32_t reg_id,
		       a_uint16_t reg_val)
{
	sw_error_t rv;
#if defined(IN_PHY_I2C_MODE)
	a_uint32_t port_id = qca_ssdk_phy_addr_to_port(dev_id, phy_id);
	a_uint8_t phy_access_type = hsl_port_phy_access_type_get(dev_id, port_id);

	if (phy_access_type == PHY_I2C_ACCESS) {
		HSL_PHY_I2C_SET(rv, dev_id, phy_id, reg_id, reg_val);
	}
	else
#endif
	{
		HSL_PHY_SET(rv, dev_id, phy_id, reg_id, reg_val);
	}

	return rv;

}

/******************************************************************************
*
* qca808x_phy_debug_write - debug port write
*
* debug port write
*/
sw_error_t
qca808x_phy_debug_write(a_uint32_t dev_id, a_uint32_t phy_id, a_uint16_t reg_id,
		       a_uint16_t reg_val)
{
	sw_error_t rv = SW_OK;

	QCA808X_REG_LOCK;
	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_DEBUG_PORT_ADDRESS, reg_id);
	if (rv != SW_OK)
	{
		QCA808X_REG_UNLOCK;
		SSDK_ERROR("qca808x_phy_reg_write failed\n");
		return SW_FAIL;
	}

	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_DEBUG_PORT_DATA, reg_val);
	if (rv != SW_OK)
	{
		QCA808X_REG_UNLOCK;
		SSDK_ERROR("qca808x_phy_reg_write failed\n");
		return SW_FAIL;
	}
	QCA808X_REG_UNLOCK;

	return rv;
}

/******************************************************************************
*
* qca808x_phy_debug_read - debug port read
*
* debug port read
*/
a_uint16_t
qca808x_phy_debug_read(a_uint32_t dev_id, a_uint32_t phy_id, a_uint16_t reg_id)
{
	sw_error_t rv = SW_OK;
	a_uint16_t phy_data = 0;

	QCA808X_REG_LOCK;
	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_DEBUG_PORT_ADDRESS, reg_id);
	if (rv != SW_OK) {
		QCA808X_REG_UNLOCK;
		SSDK_DEBUG("qca808x_phy_reg_write failed\n");
		return PHY_INVALID_DATA;
	}
	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_DEBUG_PORT_DATA);
	if (phy_data == PHY_INVALID_DATA) {
		QCA808X_REG_UNLOCK;
		SSDK_DEBUG("qca808x_phy_reg_read failed\n");
		return PHY_INVALID_DATA;
	}
	QCA808X_REG_UNLOCK;

	return phy_data;
}

/******************************************************************************
*
* qca808x_phy_mmd_write - PHY MMD register write
*
* PHY MMD register write
*/
sw_error_t
qca808x_phy_mmd_write(a_uint32_t dev_id, a_uint32_t phy_id,
		     a_uint16_t mmd_num, a_uint16_t reg_id, a_uint16_t reg_val)
{
	sw_error_t rv;
	a_uint32_t reg_id_c45 = QCA808X_REG_C45_ADDRESS(mmd_num, reg_id);
#if defined(IN_PHY_I2C_MODE)
	a_uint32_t port_id = qca_ssdk_phy_addr_to_port(dev_id, phy_id);
	a_uint8_t phy_access_type = hsl_port_phy_access_type_get(dev_id, port_id);

	if (phy_access_type == PHY_I2C_ACCESS) {
		HSL_PHY_I2C_SET(rv, dev_id, phy_id, reg_id_c45, reg_val);
	}
	else
#endif
	{
		HSL_PHY_SET(rv, dev_id, phy_id, reg_id_c45, reg_val);
	}

	return rv;
}

/******************************************************************************
*
* qca808x_phy_mmd_read -  PHY MMD register read
*
* PHY MMD register read
*/
a_uint16_t
qca808x_phy_mmd_read(a_uint32_t dev_id, a_uint32_t phy_id,
		    a_uint16_t mmd_num, a_uint16_t reg_id)
{
	sw_error_t rv = SW_OK;
	a_uint16_t phy_data = 0;
	a_uint32_t reg_id_c45 = QCA808X_REG_C45_ADDRESS(mmd_num, reg_id);
#if defined(IN_PHY_I2C_MODE)
	a_uint32_t port_id = qca_ssdk_phy_addr_to_port(dev_id, phy_id);
	a_uint8_t phy_access_type = hsl_port_phy_access_type_get(dev_id, port_id);

	if (phy_access_type == PHY_I2C_ACCESS) {
		HSL_PHY_I2C_GET(rv, dev_id, phy_id, reg_id_c45, &phy_data);
	}
	else
#endif
	{
		HSL_PHY_GET(rv, dev_id, phy_id, reg_id_c45, &phy_data);
	}

	if (rv != SW_OK) {
		return PHY_INVALID_DATA;
	}

	return phy_data;
}

static sw_error_t
qca808x_phy_ms_random_seed_set(a_uint32_t dev_id, a_uint32_t phy_id)
{
	a_uint16_t phy_data;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_debug_read(dev_id, phy_id,
		QCA808X_DEBUG_LOCAL_SEED);
	phy_data &= ~(QCA808X_MASTER_SLAVE_SEED_CFG);
	phy_data |= (prandom_u32()%QCA808X_MASTER_SLAVE_SEED_RANGE) << 2;
	SSDK_DEBUG("QCA808X_DEBUG_LOCAL_SEED:%x\n", phy_data);
	rv = qca808x_phy_debug_write(dev_id, phy_id,
		QCA808X_DEBUG_LOCAL_SEED, phy_data);

	return rv;
}

static sw_error_t
qca808x_phy_ms_seed_enable(a_uint32_t dev_id, a_uint32_t phy_id,
	a_bool_t enable)
{
	a_uint16_t phy_data;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_debug_read(dev_id, phy_id,
		QCA808X_DEBUG_LOCAL_SEED);
	if(enable)
	{
		phy_data |= QCA808X_MASTER_SLAVE_SEED_ENABLE;
	}
	else
	{
		phy_data &= ~(QCA808X_MASTER_SLAVE_SEED_ENABLE);
	}
	rv = qca808x_phy_debug_write(dev_id, phy_id,
		QCA808X_DEBUG_LOCAL_SEED, phy_data);

	return rv;
}

a_bool_t
qca808x_phy_2500caps(a_uint32_t dev_id, a_uint32_t phy_id)
{
	a_uint16_t phy_data;

	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD1_NUM,
							QCA808X_MMD1_PMA_CAP_REG);

	if (phy_data & QCA808X_STATUS_2500T_FD_CAPS) {
		phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
			QCA808X_PHY_MMD7_CHIP_TYPE);
		if(!(phy_data & QCA808X_PHY_1G_CHIP_TYPE))
			return A_TRUE;
	}

	return A_FALSE;

}

/******************************************************************************
*
* qca808x_phy_get status
*
* get phy status
*/
sw_error_t
qca808x_phy_get_status(a_uint32_t dev_id, a_uint32_t phy_id,
		struct port_phy_status *phy_status)
{
	a_uint16_t phy_data;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_SPEC_STATUS);
	PHY_RTN_ON_READ_ERROR(phy_data);

	/*get phy link status*/
	if (phy_data & QCA808X_STATUS_LINK_PASS) {
		phy_status->link_status = A_TRUE;
	}
	else {
		phy_status->link_status = A_FALSE;
		if (qca808x_phy_2500caps(dev_id, phy_id) == A_TRUE) {
			SW_RTN_ON_ERROR(
				qca808x_phy_ms_random_seed_set (dev_id, phy_id));
			/*protect logic, if MASTER_SLAVE_CONFIG_FAULT is 1,
				then disable this logic*/
			phy_data = qca808x_phy_reg_read(dev_id, phy_id,
				QCA808X_1000BASET_STATUS);
			if ((phy_data & QCA808X_MASTER_SLAVE_CONFIG_FAULT) >> 15)
			{
				SW_RTN_ON_ERROR(
					qca808x_phy_ms_seed_enable (dev_id, phy_id, A_FALSE));
				SSDK_INFO("master_slave_config_fault was set\n");
			}
		}

		return SW_OK;
	}

	/*get phy speed*/
	switch (phy_data & QCA808X_STATUS_SPEED_MASK) {
		case QCA808X_STATUS_SPEED_2500MBS:
			phy_status->speed = FAL_SPEED_2500;
			break;
		case QCA808X_STATUS_SPEED_1000MBS:
			phy_status->speed = FAL_SPEED_1000;
			break;
		case QCA808X_STATUS_SPEED_100MBS:
			phy_status->speed = FAL_SPEED_100;
			break;
		case QCA808X_STATUS_SPEED_10MBS:
			phy_status->speed = FAL_SPEED_10;
			break;
		default:
			return SW_READ_ERROR;
	}

	/*get phy duplex*/
	if (phy_data & QCA808X_STATUS_FULL_DUPLEX) {
		phy_status->duplex = FAL_FULL_DUPLEX;
	} else {
		phy_status->duplex = FAL_HALF_DUPLEX;
	}

	/* get phy flowctrl resolution status */
	if (phy_data & QCA808X_PHY_RX_FLOWCTRL_STATUS) {
		phy_status->rx_flowctrl = A_TRUE;
	} else {
		phy_status->rx_flowctrl = A_FALSE;
	}

	if (phy_data & QCA808X_PHY_TX_FLOWCTRL_STATUS) {
		phy_status->tx_flowctrl = A_TRUE;
	} else {
		phy_status->tx_flowctrl = A_FALSE;
	}

	return SW_OK;
}

/******************************************************************************
*
* qca808x_phy_get_speed - Determines the speed of phy ports associated with the
* specified device.
*/

sw_error_t
qca808x_phy_get_speed(a_uint32_t dev_id, a_uint32_t phy_id,
		     fal_port_speed_t * speed)
{
	sw_error_t rv = SW_OK;
	struct port_phy_status phy_status = {0};

	rv = qca808x_phy_get_status(dev_id, phy_id, &phy_status);
	PHY_RTN_ON_ERROR(rv);

	if (phy_status.link_status == A_TRUE) {
		*speed = phy_status.speed;
	} else {
		*speed = FAL_SPEED_10;
	}

	return rv;
}

/******************************************************************************
*
* qca808x_phy_set_force_speed - Force the speed of qca808x phy ports associated with the
* specified device.
*/
sw_error_t
qca808x_phy_set_force_speed(a_uint32_t dev_id, a_uint32_t phy_id,
		     fal_port_speed_t speed)
{
	a_uint16_t phy_data1 = 0;
	a_uint16_t phy_data2 = 0;
	sw_error_t rv = SW_OK;

	/* the speed of qca808x controled by MMD1 PMA/PMD control register */
	phy_data1 = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD1_NUM,
			QCA808X_PHY_MMD1_PMA_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data1);
	phy_data1 &= ~QCA808X_PMA_CONTROL_SPEED_MASK;

	phy_data2 = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD1_NUM,
			QCA808X_PHY_MMD1_PMA_TYPE);
	PHY_RTN_ON_READ_ERROR(phy_data2);
	phy_data2 &= ~QCA808X_PMA_TYPE_MASK;

	switch(speed)
	{
#if 0
		case FAL_SPEED_2500:
			if(!qca808x_phy_2500caps(dev_id, phy_id))
				return SW_NOT_SUPPORTED;
			phy_data1 |= QCA808X_PMA_CONTROL_2500M;
			phy_data2 |= QCA808X_PMA_TYPE_2500M;
			break;
#endif
		case FAL_SPEED_1000:
			phy_data1 |= QCA808X_PMA_CONTROL_1000M;
			phy_data2 |= QCA808X_PMA_TYPE_1000M;
			break;
		case FAL_SPEED_100:
			phy_data1 |= QCA808X_PMA_CONTROL_100M;
			phy_data2 |= QCA808X_PMA_TYPE_100M;
			break;
		case FAL_SPEED_10:
			phy_data1 |= QCA808X_PMA_CONTROL_10M;
			phy_data2 |= QCA808X_PMA_TYPE_10M;
			break;
		default:
			return SW_BAD_PARAM;
	}

	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD1_NUM,
			QCA808X_PHY_MMD1_PMA_CONTROL, phy_data1);
	PHY_RTN_ON_ERROR(rv);

	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD1_NUM,
			QCA808X_PHY_MMD1_PMA_TYPE, phy_data2);

	return rv;
}

sw_error_t
_qca808x_phy_set_autoneg_adv_ext(a_uint32_t dev_id, a_uint32_t phy_id, a_uint32_t autoneg)
{
	a_uint16_t phy_data = 0;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
			QCA808X_PHY_MMD7_AUTONEGOTIATION_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (autoneg & FAL_PHY_ADV_2500T_FD) {
		phy_data |= QCA808X_ADVERTISE_2500FULL;
	} else {
		phy_data &= ~QCA808X_ADVERTISE_2500FULL;
	}

	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
			QCA808X_PHY_MMD7_AUTONEGOTIATION_CONTROL, phy_data);

	return rv;

}

/******************************************************************************
*
* qca808x_phy_set_speed - Determines the speed of phy ports associated with the
* specified device.
*/
sw_error_t
qca808x_phy_set_speed(a_uint32_t dev_id, a_uint32_t phy_id,
		     fal_port_speed_t speed)
{
	a_uint16_t phy_data = 0;
	fal_port_duplex_t old_duplex = QCA808X_CTRL_FULL_DUPLEX;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	switch(speed)
	{
		case FAL_SPEED_2500:
		case FAL_SPEED_1000:
			if (speed == FAL_SPEED_2500) {
				if(!qca808x_phy_2500caps(dev_id, phy_id))
					return SW_NOT_SUPPORTED;
				rv = _qca808x_phy_set_autoneg_adv_ext(dev_id, phy_id,
						FAL_PHY_ADV_2500T_FD);
				PHY_RTN_ON_ERROR(rv);
			} else {
				rv = _qca808x_phy_set_autoneg_adv_ext(dev_id, phy_id,
						~FAL_PHY_ADV_2500T_FD);
				PHY_RTN_ON_ERROR(rv);
			}
			phy_data |= QCA808X_CTRL_FULL_DUPLEX;
			phy_data |= QCA808X_CTRL_AUTONEGOTIATION_ENABLE;
			phy_data |= QCA808X_CTRL_RESTART_AUTONEGOTIATION;
			break;
		case FAL_SPEED_100:
		case FAL_SPEED_10:
			/* set qca808x phy speed by pma control registers */
			rv = qca808x_phy_set_force_speed(dev_id, phy_id, speed);
			PHY_RTN_ON_ERROR(rv);
			rv = qca808x_phy_get_duplex(dev_id, phy_id, &old_duplex);
			PHY_RTN_ON_ERROR(rv);

			if (old_duplex == FAL_FULL_DUPLEX) {
				phy_data |= QCA808X_CTRL_FULL_DUPLEX;
			}
			else if (old_duplex == FAL_HALF_DUPLEX) {
				phy_data &= ~QCA808X_CTRL_FULL_DUPLEX;
			}
			phy_data &= ~QCA808X_CTRL_AUTONEGOTIATION_ENABLE;
			break;
		default:
			return SW_BAD_PARAM;
	}

	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_PHY_CONTROL, phy_data);

	return rv;
}

/******************************************************************************
*
* qca808x_phy_set_duplex - Determines the duplex of phy ports associated with the
* specified device.
*/
sw_error_t
qca808x_phy_set_duplex(a_uint32_t dev_id, a_uint32_t phy_id,
		      fal_port_duplex_t duplex)
{
	a_uint16_t phy_data = 0;
	fal_port_speed_t old_speed;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	rv = qca808x_phy_get_speed(dev_id, phy_id, &old_speed);
	PHY_RTN_ON_ERROR(rv);

	switch(old_speed)
	{
		case FAL_SPEED_2500:
		case FAL_SPEED_1000:
			if (duplex == FAL_FULL_DUPLEX) {
				phy_data |= QCA808X_CTRL_FULL_DUPLEX;
			} else {
				return SW_NOT_SUPPORTED;
			}
			phy_data |= QCA808X_CTRL_AUTONEGOTIATION_ENABLE;

			if (old_speed == FAL_SPEED_2500) {
				rv = _qca808x_phy_set_autoneg_adv_ext(dev_id, phy_id,
						FAL_PHY_ADV_2500T_FD);
				PHY_RTN_ON_ERROR(rv);
			} else {
				rv = _qca808x_phy_set_autoneg_adv_ext(dev_id, phy_id,
						~FAL_PHY_ADV_2500T_FD);
				PHY_RTN_ON_ERROR(rv);
			}
			break;
		case FAL_SPEED_100:
		case FAL_SPEED_10:
			/* force the speed */
			rv = qca808x_phy_set_force_speed(dev_id, phy_id, old_speed);
			PHY_RTN_ON_ERROR(rv);
			phy_data &= ~QCA808X_CTRL_AUTONEGOTIATION_ENABLE;
			if (duplex == FAL_FULL_DUPLEX) {
				phy_data |= QCA808X_CTRL_FULL_DUPLEX;
			} else {
				phy_data &= ~QCA808X_CTRL_FULL_DUPLEX;
			}
			break;
		default:
			return SW_FAIL;
	}
	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_PHY_CONTROL, phy_data);

	return rv;
}

/******************************************************************************
*
* qca808x_phy_get_duplex - Determines the duplex of phy ports associated with the
* specified device.
*/
sw_error_t
qca808x_phy_get_duplex(a_uint32_t dev_id, a_uint32_t phy_id,
		      fal_port_duplex_t * duplex)
{
	sw_error_t rv = SW_OK;
	struct port_phy_status phy_status = {0};

	rv = qca808x_phy_get_status(dev_id, phy_id, &phy_status);
	PHY_RTN_ON_ERROR(rv);

	if (phy_status.link_status == A_TRUE) {
		*duplex = phy_status.duplex;
	} else {
		*duplex = FAL_HALF_DUPLEX;
	}

	return rv;
}

/******************************************************************************
*
* qca808x_phy_reset - reset the phy
*
* reset the phy
*/
sw_error_t qca808x_phy_reset(a_uint32_t dev_id, a_uint32_t phy_id)
{
	a_uint16_t phy_data;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_PHY_CONTROL,
			     phy_data | QCA808X_CTRL_SOFTWARE_RESET);
	SW_RTN_ON_ERROR(rv);

	/*the configure will lost when reset.*/
	if (qca808x_phy_2500caps(dev_id, phy_id) == A_TRUE)
		rv = qca808x_phy_ms_seed_enable(dev_id, phy_id, A_TRUE);

	return rv;
}
/******************************************************************************
*
* qca808x_phy_status - test to see if the specified phy link is alive
*
* RETURNS:
*    A_TRUE  --> link is alive
*    A_FALSE --> link is down
*/
a_bool_t qca808x_phy_get_link_status(a_uint32_t dev_id, a_uint32_t phy_id)
{
	struct port_phy_status phy_status = {0};
	sw_error_t rv = SW_OK;

	rv = qca808x_phy_get_status(dev_id, phy_id, &phy_status);
	if (rv == SW_OK) {
		return phy_status.link_status;
	} else {
		return A_FALSE;
	}
}
#ifndef IN_PORTCONTROL_MINI
/******************************************************************************
*
* qca808x_phy_cdt - cable diagnostic test
*
* cable diagnostic test
*/

static inline fal_cable_status_t _phy_cdt_status_mapping(a_uint16_t status)
{
	fal_cable_status_t status_mapping = FAL_CABLE_STATUS_INVALID;

	switch (status) {
		case 0:
			status_mapping = FAL_CABLE_STATUS_INVALID;
			break;
		case 1:
			status_mapping = FAL_CABLE_STATUS_NORMAL;
			break;
		case 2:
			status_mapping = FAL_CABLE_STATUS_OPENED;
			break;
		case 3:
			status_mapping = FAL_CABLE_STATUS_SHORT;
			break;
	}

	return status_mapping;
}

static sw_error_t qca808x_phy_cdt_start(a_uint32_t dev_id, a_uint32_t phy_id)
{
	a_uint16_t status = 0;
	a_uint16_t ii = 100;
	sw_error_t rv = SW_OK;

	/* RUN CDT */
	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_PHY_CDT_CONTROL,
			     QCA808X_RUN_CDT | QCA808X_CABLE_LENGTH_UNIT);
	PHY_RTN_ON_ERROR(rv);

	do {
		aos_mdelay(30);
		status =
		    qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_CDT_CONTROL);
		PHY_RTN_ON_READ_ERROR(status);
	}
	while ((status & QCA808X_RUN_CDT) && (--ii));

	if (ii == 0) {
		return SW_TIMEOUT;
	} else {
		return SW_OK;
	}
}

sw_error_t
qca808x_phy_cdt(a_uint32_t dev_id, a_uint32_t phy_id, a_uint32_t mdi_pair,
	       fal_cable_status_t * cable_status, a_uint32_t * cable_len)
{
	a_uint16_t cable_delta_time = 0;
	a_uint16_t status;
	sw_error_t rv;

	if ((mdi_pair >= QCA808X_MDI_PAIR_NUM)) {
		return SW_BAD_PARAM;
	}

	rv = qca808x_phy_cdt_start(dev_id, phy_id);

	if (rv != SW_OK) {
		*cable_status = FAL_CABLE_STATUS_INVALID;
		*cable_len = 0;
		return rv;
	}

	/* Get cable status */
	status = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
			QCA808X_PHY_CDT_STATUS);
	PHY_RTN_ON_READ_ERROR(status);

	switch (mdi_pair) {
		case 0:
			*cable_status =
				_phy_cdt_status_mapping((status >> 12) & 0x3);
			cable_delta_time =
				qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
						QCA808X_PHY_CDT_DIAG_PAIR0);
			PHY_RTN_ON_READ_ERROR(cable_delta_time);

			break;
		case 1:
			*cable_status =
				_phy_cdt_status_mapping((status >> 8) & 0x3);
			cable_delta_time =
				qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
						QCA808X_PHY_CDT_DIAG_PAIR1);
			PHY_RTN_ON_READ_ERROR(cable_delta_time);

			break;
		case 2:
			*cable_status =
				_phy_cdt_status_mapping((status >> 4) & 0x3);
			cable_delta_time =
				qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
						QCA808X_PHY_CDT_DIAG_PAIR2);
			PHY_RTN_ON_READ_ERROR(cable_delta_time);

			break;
		case 3:
			*cable_status =
				_phy_cdt_status_mapping(status & 0x3);
			cable_delta_time =
				qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
						QCA808X_PHY_CDT_DIAG_PAIR3);
			PHY_RTN_ON_READ_ERROR(cable_delta_time);

			break;
	}

	/* the actual cable length equals to CableDeltaTime * 0.824 */
	*cable_len = ((cable_delta_time & 0xff) * 824) / 1000;

	return rv;
}

/******************************************************************************
*
* qca808x_phy_set_mdix -
*
* set phy mdix configuraiton
*/
sw_error_t
qca808x_phy_set_mdix(a_uint32_t dev_id, a_uint32_t phy_id,
		    fal_port_mdix_mode_t mode)
{
	a_uint16_t phy_data;
	sw_error_t rv;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_SPEC_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (mode == PHY_MDIX_AUTO) {
		phy_data |= QCA808X_PHY_MDIX_AUTO;
	} else if (mode == PHY_MDIX_MDIX) {
		phy_data &= ~QCA808X_PHY_MDIX_AUTO;
		phy_data |= QCA808X_PHY_MDIX;
	} else if (mode == PHY_MDIX_MDI) {
		phy_data &= ~QCA808X_PHY_MDIX_AUTO;
	} else {
		return SW_BAD_PARAM;
	}

	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_PHY_SPEC_CONTROL, phy_data);
	PHY_RTN_ON_ERROR(rv);

	rv = qca808x_phy_reset(dev_id, phy_id);
	return rv;
}

/******************************************************************************
*
* qca808x_phy_get_mdix
*
* get phy mdix configuration
*/
sw_error_t
qca808x_phy_get_mdix(a_uint32_t dev_id, a_uint32_t phy_id,
		    fal_port_mdix_mode_t * mode)
{
	a_uint16_t phy_data;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_SPEC_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if ((phy_data & QCA808X_PHY_MDIX_AUTO) == QCA808X_PHY_MDIX_AUTO) {
		*mode = PHY_MDIX_AUTO;
	} else if ((phy_data & QCA808X_PHY_MDIX) == QCA808X_PHY_MDIX) {
		*mode = PHY_MDIX_MDIX;
	} else {
		*mode = PHY_MDIX_MDI;
	}

	return SW_OK;

}

/******************************************************************************
*
* qca808x_phy_get_mdix status
*
* get phy mdix status
*/
sw_error_t
qca808x_phy_get_mdix_status(a_uint32_t dev_id, a_uint32_t phy_id,
			   fal_port_mdix_status_t * mode)
{
	a_uint16_t phy_data;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_SPEC_STATUS);
	PHY_RTN_ON_READ_ERROR(phy_data);

	*mode =
	    (phy_data & QCA808X_PHY_MDIX_STATUS) ? PHY_MDIX_STATUS_MDIX :
	    PHY_MDIX_STATUS_MDI;

	return SW_OK;

}

/******************************************************************************
*
* qca808x_phy_set_local_loopback
*
* set phy local loopback
*/
sw_error_t
qca808x_phy_set_local_loopback(a_uint32_t dev_id, a_uint32_t phy_id,
			      a_bool_t enable)
{
	a_uint16_t phy_data;
	fal_port_speed_t old_speed;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (enable == A_TRUE) {
		/* get the link speed first, then force the corresponding
		 * speed to enable local loopback */
		rv = qca808x_phy_get_speed(dev_id, phy_id, &old_speed);
		PHY_RTN_ON_ERROR(rv);
		rv = qca808x_phy_set_force_speed(dev_id, phy_id, old_speed);
		PHY_RTN_ON_ERROR(rv);

		phy_data &= ~QCA808X_CTRL_AUTONEGOTIATION_ENABLE;
		phy_data |= QCA808X_LOCAL_LOOPBACK_ENABLE;
		phy_data |= QCA808X_CTRL_FULL_DUPLEX;
	} else {
		phy_data = QCA808X_COMMON_CTRL;
	}

	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_PHY_CONTROL, phy_data);
	return rv;
}

/******************************************************************************
*
* qca808x_phy_get_local_loopback
*
* get phy local loopback
*/
sw_error_t
qca808x_phy_get_local_loopback(a_uint32_t dev_id, a_uint32_t phy_id,
			      a_bool_t * enable)
{
	a_uint16_t phy_data;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (phy_data & QCA808X_LOCAL_LOOPBACK_ENABLE) {
		*enable = A_TRUE;
	} else {
		*enable = A_FALSE;
	}

	return SW_OK;

}

/******************************************************************************
*
* qca808x_phy_set_remote_loopback
*
* set phy remote loopback
*/
sw_error_t
qca808x_phy_set_remote_loopback(a_uint32_t dev_id, a_uint32_t phy_id,
			       a_bool_t enable)
{
	a_uint16_t phy_data;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
					QCA808X_PHY_MMD3_ADDR_REMOTE_LOOPBACK_CTRL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (enable == A_TRUE) {
		phy_data |= QCA808X_PHY_REMOTE_LOOPBACK_EN;
	} else {
		phy_data &= ~QCA808X_PHY_REMOTE_LOOPBACK_EN;
	}

	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
			     QCA808X_PHY_MMD3_ADDR_REMOTE_LOOPBACK_CTRL,
			     phy_data);
	return rv;

}

/******************************************************************************
*
* qca808x_phy_get_remote_loopback
*
* get phy remote loopback
*/
sw_error_t
qca808x_phy_get_remote_loopback(a_uint32_t dev_id, a_uint32_t phy_id,
			       a_bool_t * enable)
{
	a_uint16_t phy_data;

	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
					QCA808X_PHY_MMD3_ADDR_REMOTE_LOOPBACK_CTRL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (phy_data & QCA808X_PHY_REMOTE_LOOPBACK_EN) {
		*enable = A_TRUE;
	} else {
		*enable = A_FALSE;
	}

	return SW_OK;

}
#endif
/******************************************************************************
*
* qca808x_set_autoneg_adv - set the phy autoneg Advertisement
*
*/
sw_error_t
qca808x_phy_set_autoneg_adv(a_uint32_t dev_id, a_uint32_t phy_id,
			   a_uint32_t autoneg)
{
	a_uint16_t phy_data = 0;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id,
			QCA808X_AUTONEG_ADVERT);
	PHY_RTN_ON_READ_ERROR(phy_data);

	phy_data &= ~QCA808X_ADVERTISE_MEGA_ALL;

	if (autoneg & FAL_PHY_ADV_100TX_FD) {
		phy_data |= QCA808X_ADVERTISE_100FULL;
	}

	if (autoneg & FAL_PHY_ADV_100TX_HD) {
		phy_data |= QCA808X_ADVERTISE_100HALF;
	}

	if (autoneg & FAL_PHY_ADV_10T_FD) {
		phy_data |= QCA808X_ADVERTISE_10FULL;
	}

	if (autoneg & FAL_PHY_ADV_10T_HD) {
		phy_data |= QCA808X_ADVERTISE_10HALF;
	}

	if (autoneg & FAL_PHY_ADV_PAUSE) {
		phy_data |= QCA808X_ADVERTISE_PAUSE;
	}

	if (autoneg & FAL_PHY_ADV_ASY_PAUSE) {
		phy_data |= QCA808X_ADVERTISE_ASYM_PAUSE;
	}
	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_AUTONEG_ADVERT,
			phy_data);
	PHY_RTN_ON_ERROR(rv);

	phy_data = qca808x_phy_reg_read(dev_id, phy_id,
				QCA808X_1000BASET_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	phy_data &= ~QCA808X_ADVERTISE_1000FULL;
	phy_data &= ~QCA808X_ADVERTISE_1000HALF;

	if (autoneg & FAL_PHY_ADV_1000T_FD) {
		phy_data |= QCA808X_ADVERTISE_1000FULL;
	}

	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_1000BASET_CONTROL,
			phy_data);
	PHY_RTN_ON_ERROR(rv);

	if (qca808x_phy_2500caps(dev_id, phy_id) == A_TRUE) {
		rv = _qca808x_phy_set_autoneg_adv_ext(dev_id, phy_id, autoneg);
		PHY_RTN_ON_ERROR(rv);
	} else {
		if(autoneg & FAL_PHY_ADV_2500T_FD) {
			SSDK_ERROR("2.5G auto adv is not supported\n");
			return SW_NOT_SUPPORTED;
		}
	}

	return SW_OK;
}

sw_error_t
_qca808x_phy_get_autoneg_adv_ext(a_uint32_t dev_id, a_uint32_t phy_id, a_uint16_t *phy_data)
{
	*phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
			QCA808X_PHY_MMD7_AUTONEGOTIATION_CONTROL);
	PHY_RTN_ON_READ_ERROR(*phy_data);

	return SW_OK;
}

/******************************************************************************
*
* qca808x_get_autoneg_adv - get the phy autoneg Advertisement
*
*/
sw_error_t
qca808x_phy_get_autoneg_adv(a_uint32_t dev_id, a_uint32_t phy_id,
			   a_uint32_t * autoneg)
{
	a_uint16_t phy_data = 0;
	sw_error_t rv = SW_OK;

	*autoneg = 0;
	phy_data =
		qca808x_phy_reg_read(dev_id, phy_id, QCA808X_AUTONEG_ADVERT);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (phy_data & QCA808X_ADVERTISE_100FULL) {
		*autoneg |= FAL_PHY_ADV_100TX_FD;
	}

	if (phy_data & QCA808X_ADVERTISE_100HALF) {
		*autoneg |= FAL_PHY_ADV_100TX_HD;
	}

	if (phy_data & QCA808X_ADVERTISE_10FULL) {
		*autoneg |= FAL_PHY_ADV_10T_FD;
	}

	if (phy_data & QCA808X_ADVERTISE_10HALF) {
		*autoneg |= FAL_PHY_ADV_10T_HD;
	}

	if (phy_data & QCA808X_ADVERTISE_PAUSE) {
		*autoneg |= FAL_PHY_ADV_PAUSE;
	}

	if (phy_data & QCA808X_ADVERTISE_ASYM_PAUSE) {
		*autoneg |= FAL_PHY_ADV_ASY_PAUSE;
	}

	phy_data = qca808x_phy_reg_read(dev_id, phy_id,
				QCA808X_1000BASET_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (phy_data & QCA808X_ADVERTISE_1000FULL) {
		*autoneg |= FAL_PHY_ADV_1000T_FD;
	}

	if (qca808x_phy_2500caps(dev_id, phy_id) == A_TRUE) {
		rv = _qca808x_phy_get_autoneg_adv_ext(dev_id, phy_id, &phy_data);
		if ((rv == SW_OK) &&
				(phy_data & QCA808X_ADVERTISE_2500FULL)) {
			*autoneg |= FAL_PHY_ADV_2500T_FD;
		}
	}

	return rv;
}

/******************************************************************************
*
* qca808x_phy_autoneg_status - get the phy autoneg status
*
*/
a_bool_t qca808x_phy_autoneg_status(a_uint32_t dev_id, a_uint32_t phy_id)
{
	a_uint16_t phy_data;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_CONTROL);

	if (phy_data & QCA808X_CTRL_AUTONEGOTIATION_ENABLE) {
		return A_TRUE;
	}

	return A_FALSE;
}

/******************************************************************************
*
* qca808x_restart_autoneg - restart the phy autoneg
*
*/
sw_error_t qca808x_phy_restart_autoneg(a_uint32_t dev_id, a_uint32_t phy_id)
{
	a_uint16_t phy_data = 0;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	phy_data |= QCA808X_CTRL_AUTONEGOTIATION_ENABLE;
	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_PHY_CONTROL,
			     phy_data | QCA808X_CTRL_RESTART_AUTONEGOTIATION);

	return rv;
}

/******************************************************************************
*
* qca808x_phy_enable_autonego
*
*/
sw_error_t qca808x_phy_enable_autoneg(a_uint32_t dev_id, a_uint32_t phy_id)
{
	a_uint16_t phy_data = 0;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_PHY_CONTROL,
			     phy_data | QCA808X_CTRL_AUTONEGOTIATION_ENABLE);

	return rv;
}

/******************************************************************************
*
* qca808x_phy_get_phy_id - get the phy id
*
*/
sw_error_t
qca808x_phy_get_phy_id(a_uint32_t dev_id, a_uint32_t phy_id,
		      a_uint32_t *phy_data)
{
	a_uint16_t org_id, rev_id;
	org_id = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_ID1);
	PHY_RTN_ON_READ_ERROR(org_id);

	rev_id = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_ID2);
	PHY_RTN_ON_READ_ERROR(rev_id);

	*phy_data = ((org_id & 0xffff) << 16) | (rev_id & 0xffff);

	return SW_OK;
}

/******************************************************************************
*
* qca808x_phy_off - power off the phy
*
* Power off the phy
*/
sw_error_t qca808x_phy_poweroff(a_uint32_t dev_id, a_uint32_t phy_id)
{
	a_uint16_t phy_data;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_PHY_CONTROL,
				     phy_data | QCA808X_CTRL_POWER_DOWN);
	return rv;
}

/******************************************************************************
*
* qca808x_phy_on - power on the phy
*
* Power on the phy
*/
sw_error_t qca808x_phy_poweron(a_uint32_t dev_id, a_uint32_t phy_id)
{
	a_uint16_t phy_data;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_CONTROL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_PHY_CONTROL,
			phy_data & ~QCA808X_CTRL_POWER_DOWN);

	aos_mdelay(200);

	return rv;
}
#ifndef IN_PORTCONTROL_MINI
/******************************************************************************
*
* qca808x_phy_set_802.3az
*
* set 802.3az status
*/
sw_error_t
qca808x_phy_set_8023az(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t enable)
{
	a_uint16_t phy_data;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
				       QCA808X_PHY_MMD7_ADDR_8023AZ_EEE_CTRL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (enable == A_TRUE) {
		phy_data |= QCA808X_PHY_8023AZ_EEE_1000BT;
		phy_data |= QCA808X_PHY_8023AZ_EEE_100BT;
	} else {
		phy_data &= ~QCA808X_PHY_8023AZ_EEE_1000BT;
		phy_data &= ~QCA808X_PHY_8023AZ_EEE_100BT;
	}

	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
			QCA808X_PHY_MMD7_ADDR_8023AZ_EEE_CTRL, phy_data);
	PHY_RTN_ON_ERROR(rv);

	rv = qca808x_phy_restart_autoneg(dev_id, phy_id);

	return rv;
}

/******************************************************************************
*
* qca808x_phy_get_8023az status
*
* get 8023az status
*/
sw_error_t
qca808x_phy_get_8023az(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t * enable)
{
	a_uint16_t phy_data;
	*enable = A_FALSE;

	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
				       QCA808X_PHY_MMD7_ADDR_8023AZ_EEE_CTRL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if ((phy_data & QCA808X_PHY_8023AZ_EEE_1000BT) &&
			(phy_data & QCA808X_PHY_8023AZ_EEE_100BT)) {
		*enable = A_TRUE;
	}

	return SW_OK;
}

/******************************************************************************
*
* _qca808x_phy_get_8023az_status status
*
* get 8023az status
*/
sw_error_t
_qca808x_phy_get_8023az_status(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t * enable)
{
	a_uint16_t phy_data;
	*enable = A_FALSE;

	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
				       QCA808X_PHY_MMD3_ADDR_8023AZ_EEE_DB);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (phy_data & QCA808X_PHY_8023AZ_EEE_LP_STAT) {
		*enable = A_TRUE;
	}

	return SW_OK;
}

/******************************************************************************
*
* qca808x_phy_set wol frame mac address
*
* set phy wol frame mac address
*/
sw_error_t
qca808x_phy_set_magic_frame_mac(a_uint32_t dev_id, a_uint32_t phy_id,
			       fal_mac_addr_t * mac)
{
	a_uint16_t phy_data1;
	a_uint16_t phy_data2;
	a_uint16_t phy_data3;
	sw_error_t rv = SW_OK;

	phy_data1 = (mac->uc[0] << 8) | mac->uc[1];
	phy_data2 = (mac->uc[2] << 8) | mac->uc[3];
	phy_data3 = (mac->uc[4] << 8) | mac->uc[5];

	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
			     QCA808X_PHY_MMD3_WOL_MAGIC_MAC_CTRL1, phy_data1);
	PHY_RTN_ON_ERROR(rv);

	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
			     QCA808X_PHY_MMD3_WOL_MAGIC_MAC_CTRL2, phy_data2);
	PHY_RTN_ON_ERROR(rv);

	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
			     QCA808X_PHY_MMD3_WOL_MAGIC_MAC_CTRL3, phy_data3);

	return rv;
}

/******************************************************************************
*
* qca808x_phy_get wol frame mac address
*
* get phy wol frame mac address
*/
sw_error_t
qca808x_phy_get_magic_frame_mac(a_uint32_t dev_id, a_uint32_t phy_id,
			       fal_mac_addr_t * mac)
{
	a_uint16_t phy_data1;
	a_uint16_t phy_data2;
	a_uint16_t phy_data3;

	phy_data1 = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
					QCA808X_PHY_MMD3_WOL_MAGIC_MAC_CTRL1);
	PHY_RTN_ON_READ_ERROR(phy_data1);

	phy_data2 = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
					QCA808X_PHY_MMD3_WOL_MAGIC_MAC_CTRL2);
	PHY_RTN_ON_READ_ERROR(phy_data2);

	phy_data3 = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
					QCA808X_PHY_MMD3_WOL_MAGIC_MAC_CTRL3);
	PHY_RTN_ON_READ_ERROR(phy_data3);

	mac->uc[0] = (phy_data1 >> 8);
	mac->uc[1] = (phy_data1 & 0x00ff);
	mac->uc[2] = (phy_data2 >> 8);
	mac->uc[3] = (phy_data2 & 0x00ff);
	mac->uc[4] = (phy_data3 >> 8);
	mac->uc[5] = (phy_data3 & 0x00ff);

	return SW_OK;
}

/******************************************************************************
*
* qca808x_phy_set wol enable or disable
*
* set phy wol enable or disable
*/
sw_error_t
qca808x_phy_set_wol_status(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t enable)
{
	a_uint16_t phy_data;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
				       QCA808X_PHY_MMD3_WOL_CTRL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (enable == A_TRUE) {
		phy_data |= QCA808X_PHY_WOL_EN;
	} else {
		phy_data &= ~QCA808X_PHY_WOL_EN;
	}

	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
			     QCA808X_PHY_MMD3_WOL_CTRL, phy_data);

	return rv;
}

/******************************************************************************
*
* qca808x_phy_get_wol status
*
* get wol status
*/
sw_error_t
qca808x_phy_get_wol_status(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t * enable)
{
	a_uint16_t phy_data;

	*enable = A_FALSE;

	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
				       QCA808X_PHY_MMD3_WOL_CTRL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (phy_data & QCA808X_PHY_WOL_EN) {
		*enable = A_TRUE;
	}

	return SW_OK;
}

/******************************************************************************
*
* qca808x_phy_set_hibernate - set hibernate status
*
* set hibernate status
*/
sw_error_t
qca808x_phy_set_hibernate(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t enable)
{
	a_uint16_t phy_data;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_debug_read(dev_id, phy_id,
			QCA808X_DEBUG_PHY_HIBERNATION_CTRL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (enable == A_TRUE) {
		phy_data |= QCA808X_PHY_HIBERNATION_CFG;
	} else {
		phy_data &= ~QCA808X_PHY_HIBERNATION_CFG;
	}

	rv = qca808x_phy_debug_write(dev_id, phy_id,
			QCA808X_DEBUG_PHY_HIBERNATION_CTRL, phy_data);

	return rv;
}

/******************************************************************************
*
* qca808x_phy_get_hibernate - get hibernate status
*
* get hibernate status
*/
sw_error_t
qca808x_phy_get_hibernate(a_uint32_t dev_id, a_uint32_t phy_id,
			 a_bool_t * enable)
{
	a_uint16_t phy_data;

	*enable = A_FALSE;

	phy_data = qca808x_phy_debug_read(dev_id, phy_id,
			QCA808X_DEBUG_PHY_HIBERNATION_CTRL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (phy_data & QCA808X_PHY_HIBERNATION_CFG) {
		*enable = A_TRUE;
	}

	return SW_OK;
}

/******************************************************************************
*
* _qca808x_phy_get_hibernate_status - get hibernate status
*
* get hibernate status
*/
sw_error_t
_qca808x_phy_get_hibernate_status(a_uint32_t dev_id, a_uint32_t phy_id,
			 a_bool_t * enable)
{
	a_uint16_t phy_data;

	*enable = A_TRUE;

	phy_data = qca808x_phy_debug_read(dev_id, phy_id,
			QCA808X_DEBUG_PHY_HIBERNATION_STAT);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (phy_data & QCA808X_PHY_HIBERNATION_STAT_EN) {
		*enable = A_FALSE;
	}

	return SW_OK;
}
#endif
/******************************************************************************
*
* qca808x_phy_interface mode set
*
* set qca808x phy interface mode
*/
sw_error_t
qca808x_phy_interface_set_mode(a_uint32_t dev_id, a_uint32_t phy_id,
		fal_port_interface_mode_t interface_mode)
{
	/* qca808x phy will automatically switch the interface mode according
	 * to the speed, 2.5G works on SGMII+, other works on SGMII.
	 */

	return SW_OK;
}

/******************************************************************************
*
* qca808x_phy_interface mode get
*
* get qca808x phy interface mode
*/
sw_error_t
qca808x_phy_interface_get_mode(a_uint32_t dev_id, a_uint32_t phy_id,
		fal_port_interface_mode_t *interface_mode)
{
	a_uint16_t phy_data;
	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_CHIP_CONFIG);
	PHY_RTN_ON_READ_ERROR(phy_data);

	phy_data &= QCA808X_PHY_CHIP_MODE_CFG;
	if (phy_data == QCA808X_PHY_SGMII_BASET) {
		*interface_mode = PHY_SGMII_BASET;
	}

	return SW_OK;
}

/******************************************************************************
*
* qca808x_phy_interface mode status get
*
* get qca808x phy interface mode status
*/
sw_error_t
qca808x_phy_interface_get_mode_status(a_uint32_t dev_id, a_uint32_t phy_id,
		fal_port_interface_mode_t *interface_mode_status)
{
	a_uint16_t phy_data;
	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_CHIP_CONFIG);
	PHY_RTN_ON_READ_ERROR(phy_data);

	phy_data &= QCA808X_PHY_MODE_MASK;
	switch (phy_data) {
		case QCA808X_PHY_SGMII_PLUS_MODE:
			*interface_mode_status = PORT_SGMII_PLUS;
			break;
		case QCA808X_PHY_SGMII_MODE:
			*interface_mode_status = PHY_SGMII_BASET;
			break;
		default:
			*interface_mode_status = PORT_INTERFACE_MODE_MAX;
			break;
	}

	return SW_OK;
}
#ifndef IN_PORTCONTROL_MINI
/******************************************************************************
*
* qca808x_phy_set_intr_mask - Set interrupt mask with the
* specified device.
*/
sw_error_t
qca808x_phy_set_intr_mask(a_uint32_t dev_id, a_uint32_t phy_id,
			 a_uint32_t intr_mask_flag)
{
	a_uint16_t phy_data = 0;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_INTR_MASK);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (intr_mask_flag & FAL_PHY_INTR_STATUS_UP_CHANGE) {
		phy_data |= QCA808X_INTR_STATUS_UP_CHANGE;
	} else {
		phy_data &= (~QCA808X_INTR_STATUS_UP_CHANGE);
	}

	if (intr_mask_flag & FAL_PHY_INTR_STATUS_DOWN_CHANGE) {
		phy_data |= QCA808X_INTR_STATUS_DOWN_CHANGE;
	} else {
		phy_data &= (~QCA808X_INTR_STATUS_DOWN_CHANGE);
	}

	if (intr_mask_flag & FAL_PHY_INTR_SPEED_CHANGE) {
		phy_data |= QCA808X_INTR_SPEED_CHANGE;
	} else {
		phy_data &= (~QCA808X_INTR_SPEED_CHANGE);
	}

	if (intr_mask_flag & FAL_PHY_INTR_BX_FX_STATUS_UP_CHANGE) {
		phy_data |= QCA808X_INTR_LINK_SUCCESS_SG;
	} else {
		phy_data &= (~QCA808X_INTR_LINK_SUCCESS_SG);
	}

	if (intr_mask_flag & FAL_PHY_INTR_BX_FX_STATUS_DOWN_CHANGE) {
		phy_data |= QCA808X_INTR_LINK_FAIL_SG;
	} else {
		phy_data &= (~QCA808X_INTR_LINK_FAIL_SG);
	}

	if (intr_mask_flag & FAL_PHY_INTR_WOL_STATUS) {
		phy_data |= QCA808X_INTR_WOL;
	} else {
		phy_data &= (~QCA808X_INTR_WOL);
	}

	if (intr_mask_flag & FAL_PHY_INTR_POE_STATUS) {
		phy_data |= QCA808X_INTR_POE;
	} else {
		phy_data &= (~QCA808X_INTR_POE);
	}

	rv = qca808x_phy_reg_write(dev_id, phy_id, QCA808X_PHY_INTR_MASK, phy_data);
	return rv;
}

/******************************************************************************
*
* qca808x_phy_get_intr_mask - Get interrupt mask with the
* specified device.
*/
sw_error_t
qca808x_phy_get_intr_mask(a_uint32_t dev_id, a_uint32_t phy_id,
			 a_uint32_t * intr_mask_flag)
{
	a_uint16_t phy_data = 0;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_INTR_MASK);
	PHY_RTN_ON_READ_ERROR(phy_data);

	*intr_mask_flag = 0;
	if (phy_data & QCA808X_INTR_STATUS_UP_CHANGE) {
		*intr_mask_flag |= FAL_PHY_INTR_STATUS_UP_CHANGE;
	}

	if (phy_data & QCA808X_INTR_STATUS_DOWN_CHANGE) {
		*intr_mask_flag |= FAL_PHY_INTR_STATUS_DOWN_CHANGE;
	}

	if (phy_data & QCA808X_INTR_SPEED_CHANGE) {
		*intr_mask_flag |= FAL_PHY_INTR_SPEED_CHANGE;
	}

	if (phy_data & QCA808X_INTR_LINK_SUCCESS_SG) {
		*intr_mask_flag |= FAL_PHY_INTR_BX_FX_STATUS_UP_CHANGE;
	}

	if (phy_data & QCA808X_INTR_LINK_FAIL_SG) {
		*intr_mask_flag |= FAL_PHY_INTR_BX_FX_STATUS_DOWN_CHANGE;
	}

	if (phy_data & QCA808X_INTR_WOL) {
		*intr_mask_flag |= FAL_PHY_INTR_WOL_STATUS;
	}

	if (phy_data & QCA808X_INTR_POE) {
		*intr_mask_flag |= FAL_PHY_INTR_POE_STATUS;
	}

	return SW_OK;
}

/******************************************************************************
*
* qca808x_phy_get_intr_status - Get interrupt status with the
* specified device.
*/
sw_error_t
qca808x_phy_get_intr_status(a_uint32_t dev_id, a_uint32_t phy_id,
			   a_uint32_t * intr_status_flag)
{
	a_uint16_t phy_data = 0;

	phy_data = qca808x_phy_reg_read(dev_id, phy_id, QCA808X_PHY_INTR_STATUS);
	PHY_RTN_ON_READ_ERROR(phy_data);

	*intr_status_flag = 0;
	if (phy_data & QCA808X_INTR_STATUS_UP_CHANGE) {
		*intr_status_flag |= FAL_PHY_INTR_STATUS_UP_CHANGE;
	}

	if (phy_data & QCA808X_INTR_STATUS_DOWN_CHANGE) {
		*intr_status_flag |= FAL_PHY_INTR_STATUS_DOWN_CHANGE;
	}

	if (phy_data & QCA808X_INTR_SPEED_CHANGE) {
		*intr_status_flag |= FAL_PHY_INTR_SPEED_CHANGE;
	}

	if (phy_data & QCA808X_INTR_LINK_SUCCESS_SG) {
		*intr_status_flag |= FAL_PHY_INTR_BX_FX_STATUS_UP_CHANGE;
	}

	if (phy_data & QCA808X_INTR_LINK_FAIL_SG) {
		*intr_status_flag |= FAL_PHY_INTR_BX_FX_STATUS_DOWN_CHANGE;
	}

	if (phy_data & QCA808X_INTR_WOL) {
		*intr_status_flag |= FAL_PHY_INTR_WOL_STATUS;
	}

	if (phy_data & QCA808X_INTR_POE) {
		*intr_status_flag |= FAL_PHY_INTR_POE_STATUS;
	}

	return SW_OK;
}

/******************************************************************************
*
* qca808x_phy_set_counter - set counter status
*
* set counter  status
*/
sw_error_t
qca808x_phy_set_counter(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t enable)
{
	a_uint16_t phy_data;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
					QCA808X_PHY_MMD7_COUNTER_CTRL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (enable == A_TRUE) {
		phy_data |= QCA808X_PHY_FRAME_CHECK_EN;
		phy_data |= QCA808X_PHY_XMIT_MAC_CNT_SELFCLR;
	} else {
		phy_data &= ~QCA808X_PHY_FRAME_CHECK_EN;
		phy_data &= ~QCA808X_PHY_XMIT_MAC_CNT_SELFCLR;
	}

	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
			     QCA808X_PHY_MMD7_COUNTER_CTRL, phy_data);

	return rv;
}

/******************************************************************************
*
* qca808x_phy_get_counter_status - get counter status
*
* set counter status
*/
sw_error_t
qca808x_phy_get_counter(a_uint32_t dev_id, a_uint32_t phy_id,
			 a_bool_t * enable)
{
	a_uint16_t phy_data;

	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
					QCA808X_PHY_MMD7_COUNTER_CTRL);
	PHY_RTN_ON_READ_ERROR(phy_data);

	if (phy_data & QCA808X_PHY_FRAME_CHECK_EN) {
		*enable = A_TRUE;
	} else {
		*enable = A_FALSE;
	}

	return SW_OK;
}

/******************************************************************************
*
* qca808x_phy_show show counter statistics
*
* show counter statistics
*/
sw_error_t
qca808x_phy_show_counter(a_uint32_t dev_id, a_uint32_t phy_id,
			 fal_port_counter_info_t * counter_infor)
{
	a_uint16_t ingress_high_counter = 0;
	a_uint16_t ingress_low_counter = 0;
	a_uint16_t egress_high_counter = 0;
	a_uint16_t egress_low_counter = 0;

	ingress_high_counter = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
					QCA808X_PHY_MMD7_INGRESS_COUNTER_HIGH);
	ingress_low_counter = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
					QCA808X_PHY_MMD7_INGRESS_COUNTER_LOW);
	counter_infor->RxGoodFrame = (ingress_high_counter << 16 ) | ingress_low_counter;
	counter_infor->RxBadCRC = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
					QCA808X_PHY_MMD7_INGRESS_ERROR_COUNTER);

	egress_high_counter = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
					QCA808X_PHY_MMD7_EGRESS_COUNTER_HIGH);
	egress_low_counter = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
					QCA808X_PHY_MMD7_EGRESS_COUNTER_LOW);
	counter_infor->TxGoodFrame = (egress_high_counter << 16 ) | egress_low_counter;
	counter_infor->TxBadCRC = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
					QCA808X_PHY_MMD7_EGRESS_ERROR_COUNTER);

	return SW_OK;
}
#endif
/******************************************************************************
*
* qca808x_phy_set_eee_advertisement
*
* set eee advertisement
*/
sw_error_t
qca808x_phy_set_eee_adv(a_uint32_t dev_id, a_uint32_t phy_id,
	a_uint32_t adv)
{
	a_uint16_t phy_data = 0;
	sw_error_t rv = SW_OK;

	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
				       QCA808X_PHY_MMD7_ADDR_8023AZ_EEE_CTRL);
	phy_data &= ~(QCA808X_PHY_EEE_ADV_100M | QCA808X_PHY_EEE_ADV_1000M);

	if (adv & FAL_PHY_EEE_100BASE_T) {
		phy_data |= QCA808X_PHY_EEE_ADV_100M;
	}
	if (adv & FAL_PHY_EEE_1000BASE_T) {
		phy_data |= QCA808X_PHY_EEE_ADV_1000M;
	}

	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
		     QCA808X_PHY_MMD7_ADDR_8023AZ_EEE_CTRL, phy_data);

	rv = qca808x_phy_restart_autoneg(dev_id, phy_id);

	return rv;
}

/******************************************************************************
*
* qca808x_phy_get_eee_advertisement
*
* get eee advertisement
*/
sw_error_t
qca808x_phy_get_eee_adv(a_uint32_t dev_id, a_uint32_t phy_id,
	a_uint32_t *adv)
{
	a_uint16_t phy_data = 0;
	sw_error_t rv = SW_OK;

	*adv = 0;
	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
				       QCA808X_PHY_MMD7_ADDR_8023AZ_EEE_CTRL);

	if (phy_data & QCA808X_PHY_EEE_ADV_100M) {
		*adv |= FAL_PHY_EEE_100BASE_T;
	}
	if (phy_data & QCA808X_PHY_EEE_ADV_1000M) {
		*adv |= FAL_PHY_EEE_1000BASE_T;
	}

	return rv;
}
/******************************************************************************
*
* qca808x_phy_get_eee_partner_advertisement
*
* get eee partner advertisement
*/
sw_error_t
qca808x_phy_get_eee_partner_adv(a_uint32_t dev_id, a_uint32_t phy_id,
	a_uint32_t *adv)
{
	a_uint16_t phy_data = 0;
	sw_error_t rv = SW_OK;

	*adv = 0;
	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
				       QCA808X_PHY_MMD7_ADDR_8023AZ_EEE_PARTNER);

	if (phy_data & QCA808X_PHY_EEE_PARTNER_ADV_100M) {
		*adv |= FAL_PHY_EEE_100BASE_T;
	}
	if (phy_data & QCA808X_PHY_EEE_PARTNER_ADV_1000M) {
		*adv |= FAL_PHY_EEE_1000BASE_T;
	}

	return rv;
}
/******************************************************************************
*
* qca808x_phy_get_eee_capability
*
* get eee capability
*/
sw_error_t
qca808x_phy_get_eee_cap(a_uint32_t dev_id, a_uint32_t phy_id,
	a_uint32_t *cap)
{
	a_uint16_t phy_data = 0;
	sw_error_t rv = SW_OK;

	*cap = 0;
	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
				       QCA808X_PHY_MMD3_ADDR_8023AZ_EEE_CAPABILITY);

	if (phy_data & QCA808X_PHY_EEE_CAPABILITY_100M) {
		*cap |= FAL_PHY_EEE_100BASE_T;
	}
	if (phy_data & QCA808X_PHY_EEE_CAPABILITY_1000M) {
		*cap |= FAL_PHY_EEE_1000BASE_T;
	}

	return rv;
}
/******************************************************************************
*
* qca808x_phy_get_eee_status
*
* get eee status
*/
sw_error_t
qca808x_phy_get_eee_status(a_uint32_t dev_id, a_uint32_t phy_id,
	a_uint32_t *status)
{
	a_uint16_t phy_data = 0;
	sw_error_t rv = SW_OK;

	*status = 0;
	phy_data = qca808x_phy_mmd_read(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
				       QCA808X_PHY_MMD7_ADDR_8023AZ_EEE_STATUS);

	if (phy_data & QCA808X_PHY_EEE_STATUS_100M) {
		*status |= FAL_PHY_EEE_100BASE_T;
	}
	if (phy_data & QCA808X_PHY_EEE_STATUS_1000M) {
		*status |= FAL_PHY_EEE_1000BASE_T;
	}

	return rv;
}

/******************************************************************************
*
* qca808x_phy_led_init - set led behavior
*
* set led behavior
*/
static sw_error_t
qca808x_phy_led_init(a_uint32_t dev_id, a_uint32_t phy_id)
{
	sw_error_t rv = SW_OK;

	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
			QCA808X_PHY_MMD7_LED_POLARITY_CTRL,
				QCA808X_PHY_MMD7_LED_POLARITY_ACTIVE_HIGH);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
			QCA808X_PHY_MMD7_LED0_CTRL,
				QCA808X_PHY_MMD7_LED0_CTRL_ENABLE);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
			QCA808X_PHY_MMD7_LED1_CTRL,
				QCA808X_PHY_MMD7_LED1_CTRL_DISABLE);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
			QCA808X_PHY_MMD7_LED2_CTRL,
				QCA808X_PHY_MMD7_LED2_CTRL_DISABLE);
	SW_RTN_ON_ERROR(rv);

	return rv;
}

static sw_error_t
qca808x_phy_fast_retrain_cfg(a_uint32_t dev_id, a_uint32_t phy_id)
{
	sw_error_t rv = SW_OK;

	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
		QCA808X_PHY_MMD7_AUTONEGOTIATION_CONTROL,
		QCA808X_ADVERTISE_2500FULL |
		QCA808X_PHY_FAST_RETRAIN_2500BT |
		QCA808X_PHY_ADV_LOOP_TIMING);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD1_NUM,
		QCA808X_PHY_MMD1_FAST_RETRAIN_STATUS_CTL,
		QCA808X_PHY_FAST_RETRAIN_CTRL);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD1_NUM,
		QCA808X_PHY_MMD1_MSE_THRESHOLD_20DB,
		QCA808X_PHY_MSE_THRESHOLD_20DB_VALUE);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD1_NUM,
		QCA808X_PHY_MMD1_MSE_THRESHOLD_17DB,
		QCA808X_PHY_MSE_THRESHOLD_17DB_VALUE);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD1_NUM,
		QCA808X_PHY_MMD1_MSE_THRESHOLD_27DB,
		QCA808X_PHY_MSE_THRESHOLD_27DB_VALUE);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD1_NUM,
		QCA808X_PHY_MMD1_MSE_THRESHOLD_28DB,
		QCA808X_PHY_MSE_THRESHOLD_28DB_VALUE);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
		QCA808X_PHY_MMD7_ADDR_EEE_LP_ADVERTISEMENT,
		QCA808X_PHY_EEE_ADV_THP);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD7_NUM,
		QCA808X_PHY_MMD7_TOP_OPTION1,
		QCA808X_PHY_TOP_OPTION1_DATA);
	SW_RTN_ON_ERROR(rv);
	/*adjust the threshold for link down*/
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
		0xa100, 0x9203);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
		0xa105, 0x8001);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
		0xa106, 0x1111);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
		0xa103, 0x1698);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
		0xa011, 0x5f85);
	SW_RTN_ON_ERROR(rv);
	rv = qca808x_phy_mmd_write(dev_id, phy_id, QCA808X_PHY_MMD3_NUM,
		0xa101, 0x48ad);

	return rv;
}

void qca808x_phy_lock_init(void)
{
	static a_bool_t is_init = A_FALSE;

	if(!is_init)
	{
		QCA808X_LOCKER_INIT;
		is_init = A_TRUE;
	}

	return;
}

static sw_error_t
qca808x_phy_adc_threshold_set(a_uint32_t dev_id, a_uint32_t phy_id,
	a_uint32_t adc_thresold)
{
	sw_error_t rv = SW_OK;
	a_uint16_t phy_data = 0;

	phy_data = qca808x_phy_debug_read(dev_id, phy_id,
		QCA808X_PHY_ADC_THRESHOLD);
	PHY_RTN_ON_READ_ERROR(phy_data);
	phy_data &= ~(BITS(0, 8));
	rv = qca808x_phy_debug_write (dev_id, phy_id,
		QCA808X_PHY_ADC_THRESHOLD, phy_data | adc_thresold);

	return rv;
}

static sw_error_t
qca808x_phy_hw_init(a_uint32_t dev_id,  a_uint32_t port_bmp)
{
	a_uint16_t phy_data = 0;
	a_uint32_t port_id = 0, phy_addr = 0;
	sw_error_t rv = SW_OK;

	for (port_id = SSDK_PHYSICAL_PORT0; port_id < SW_MAX_NR_PORT; port_id ++)
	{
		if (port_bmp & (0x1 << port_id))
		{
			phy_addr = qca_ssdk_port_to_phy_addr(dev_id, port_id);
			/*enable vga when init napa to fix 8023az issue*/
			phy_data = qca808x_phy_mmd_read(dev_id, phy_addr, QCA808X_PHY_MMD3_NUM,
				QCA808X_PHY_MMD3_ADDR_CLD_CTRL7);
			phy_data &= (~QCA808X_PHY_8023AZ_AFE_CTRL_MASK);
			phy_data |= QCA808X_PHY_8023AZ_AFE_EN;
			rv = qca808x_phy_mmd_write(dev_id, phy_addr, QCA808X_PHY_MMD3_NUM,
				QCA808X_PHY_MMD3_ADDR_CLD_CTRL7, phy_data);
			SW_RTN_ON_ERROR(rv);
			/*set napa led pin behavior on HK board*/
			rv = qca808x_phy_led_init(dev_id, phy_addr);
			SW_RTN_ON_ERROR(rv);
			/*special configuration for AZ under 1G speed mode*/
			phy_data = QCA808X_PHY_MMD3_AZ_TRAINING_VAL;
			rv = qca808x_phy_mmd_write(dev_id, phy_addr, QCA808X_PHY_MMD3_NUM,
				QCA808X_PHY_MMD3_AZ_TRAINING_CTRL, phy_data);
			SW_RTN_ON_ERROR(rv);
			if(qca808x_phy_2500caps(dev_id, phy_addr) == A_TRUE)
			{
				/*config the fast retrain*/
				rv = qca808x_phy_fast_retrain_cfg(dev_id, phy_addr);
				SW_RTN_ON_ERROR(rv);
				/*enable seed and configure ramdom seed in order that napa can be
					as slave easier*/
				rv = qca808x_phy_ms_seed_enable(dev_id, phy_addr, A_TRUE);
				SW_RTN_ON_ERROR(rv);
				rv = qca808x_phy_ms_random_seed_set(dev_id, phy_addr);
				SW_RTN_ON_ERROR(rv);
			}
			/*set adc threshold as 100mv for 10M*/
			rv = qca808x_phy_adc_threshold_set(dev_id, phy_addr,
				QCA808X_PHY_ADC_THRESHOLD_100MV);
			SW_RTN_ON_ERROR(rv);
		}
	}

	return rv;
}

static sw_error_t qca808x_phy_api_ops_init(void)
{
	sw_error_t  ret = SW_OK;
	hsl_phy_ops_t *qca808x_phy_api_ops = NULL;

	qca808x_phy_api_ops = kzalloc(sizeof(hsl_phy_ops_t), GFP_KERNEL);
	if (qca808x_phy_api_ops == NULL) {
		SSDK_ERROR("qca808x phy ops kzalloc failed!\n");
		return -ENOMEM;
	}

	phy_api_ops_init(QCA808X_PHY_CHIP);

	qca808x_phy_api_ops->phy_reg_write = qca808x_phy_reg_write;
	qca808x_phy_api_ops->phy_reg_read = qca808x_phy_reg_read;
	qca808x_phy_api_ops->phy_debug_write = qca808x_phy_debug_write;
	qca808x_phy_api_ops->phy_debug_read = qca808x_phy_debug_read;
	qca808x_phy_api_ops->phy_mmd_write = qca808x_phy_mmd_write;
	qca808x_phy_api_ops->phy_mmd_read = qca808x_phy_mmd_read;
	qca808x_phy_api_ops->phy_get_status = qca808x_phy_get_status;
	qca808x_phy_api_ops->phy_speed_get = qca808x_phy_get_speed;
	qca808x_phy_api_ops->phy_speed_set = qca808x_phy_set_speed;
	qca808x_phy_api_ops->phy_duplex_get = qca808x_phy_get_duplex;
	qca808x_phy_api_ops->phy_duplex_set = qca808x_phy_set_duplex;
	qca808x_phy_api_ops->phy_autoneg_enable_set = qca808x_phy_enable_autoneg;
	qca808x_phy_api_ops->phy_restart_autoneg = qca808x_phy_restart_autoneg;
	qca808x_phy_api_ops->phy_autoneg_status_get = qca808x_phy_autoneg_status;
	qca808x_phy_api_ops->phy_autoneg_adv_set = qca808x_phy_set_autoneg_adv;
	qca808x_phy_api_ops->phy_autoneg_adv_get = qca808x_phy_get_autoneg_adv;
	qca808x_phy_api_ops->phy_link_status_get = qca808x_phy_get_link_status;
	qca808x_phy_api_ops->phy_reset = qca808x_phy_reset;
#ifndef IN_PORTCONTROL_MINI
	qca808x_phy_api_ops->phy_cdt = qca808x_phy_cdt;
	qca808x_phy_api_ops->phy_mdix_set = qca808x_phy_set_mdix;
	qca808x_phy_api_ops->phy_mdix_get = qca808x_phy_get_mdix;
	qca808x_phy_api_ops->phy_mdix_status_get = qca808x_phy_get_mdix_status;
	qca808x_phy_api_ops->phy_local_loopback_set = qca808x_phy_set_local_loopback;
	qca808x_phy_api_ops->phy_local_loopback_get = qca808x_phy_get_local_loopback;
	qca808x_phy_api_ops->phy_remote_loopback_set = qca808x_phy_set_remote_loopback;
	qca808x_phy_api_ops->phy_remote_loopback_get = qca808x_phy_get_remote_loopback;
#endif
	qca808x_phy_api_ops->phy_id_get = qca808x_phy_get_phy_id;
	qca808x_phy_api_ops->phy_power_off = qca808x_phy_poweroff;
	qca808x_phy_api_ops->phy_power_on = qca808x_phy_poweron;
#ifndef IN_PORTCONTROL_MINI
	qca808x_phy_api_ops->phy_8023az_set = qca808x_phy_set_8023az;
	qca808x_phy_api_ops->phy_8023az_get = qca808x_phy_get_8023az;
	qca808x_phy_api_ops->phy_hibernation_set = qca808x_phy_set_hibernate;
	qca808x_phy_api_ops->phy_hibernation_get = qca808x_phy_get_hibernate;
	qca808x_phy_api_ops->phy_magic_frame_mac_set = qca808x_phy_set_magic_frame_mac;
	qca808x_phy_api_ops->phy_magic_frame_mac_get = qca808x_phy_get_magic_frame_mac;
	qca808x_phy_api_ops->phy_wol_status_set = qca808x_phy_set_wol_status;
	qca808x_phy_api_ops->phy_wol_status_get = qca808x_phy_get_wol_status;
#endif
	qca808x_phy_api_ops->phy_interface_mode_set = qca808x_phy_interface_set_mode;
	qca808x_phy_api_ops->phy_interface_mode_get = qca808x_phy_interface_get_mode;
	qca808x_phy_api_ops->phy_interface_mode_status_get = qca808x_phy_interface_get_mode_status;
#ifndef IN_PORTCONTROL_MINI
	qca808x_phy_api_ops->phy_intr_mask_set = qca808x_phy_set_intr_mask;
	qca808x_phy_api_ops->phy_intr_mask_get = qca808x_phy_get_intr_mask;
	qca808x_phy_api_ops->phy_intr_status_get = qca808x_phy_get_intr_status;
	qca808x_phy_api_ops->phy_counter_set = qca808x_phy_set_counter;
	qca808x_phy_api_ops->phy_counter_get = qca808x_phy_get_counter;
	qca808x_phy_api_ops->phy_counter_show = qca808x_phy_show_counter;
#endif
	qca808x_phy_api_ops->phy_eee_adv_set = qca808x_phy_set_eee_adv;
	qca808x_phy_api_ops->phy_eee_adv_get = qca808x_phy_get_eee_adv;
	qca808x_phy_api_ops->phy_eee_partner_adv_get = qca808x_phy_get_eee_partner_adv;
	qca808x_phy_api_ops->phy_eee_cap_get = qca808x_phy_get_eee_cap;
	qca808x_phy_api_ops->phy_eee_status_get = qca808x_phy_get_eee_status;
#ifdef IN_LED
	qca808x_phy_led_api_ops_init(qca808x_phy_api_ops);
#endif
/*qca808x_end*/
#if defined(IN_PTP)
	qca808x_phy_ptp_api_ops_init(&qca808x_phy_api_ops->phy_ptp_ops);
#endif
/*qca808x_start*/
	ret = hsl_phy_api_ops_register(QCA808X_PHY_CHIP, qca808x_phy_api_ops);

	if (ret == SW_OK) {
		SSDK_INFO("qca probe qca808x phy driver succeeded!\n");
	} else {
		SSDK_ERROR("qca probe qca808x phy driver failed! (code: %d)\n", ret);
	}

	return ret;
}

/******************************************************************************
*
* qca808x_phy_init -
*
*/
int qca808x_phy_init(a_uint32_t dev_id, a_uint32_t port_bmp)
{
/*qca808x_end*/
	a_uint32_t port_id = 0;
/*qca808x_start*/
	a_int32_t ret = 0;

	if(phy_ops_flag == A_FALSE &&
			qca808x_phy_api_ops_init() == SW_OK) {
		qca808x_phy_lock_init();
		phy_ops_flag = A_TRUE;
	}
	qca808x_phy_hw_init(dev_id, port_bmp);

/*qca808x_end*/
	if(phy_dev_drv_init_flag == A_FALSE)
	{
		for (port_id = 0; port_id < SW_MAX_NR_PORT; port_id ++)
		{
			if (port_bmp & (0x1 << port_id)) {
				qca808x_phydev_init(dev_id, port_id);
			}
		}
		ret = qca808x_phy_driver_register();
		phy_dev_drv_init_flag = A_TRUE;
	}
/*qca808x_start*/
	return ret;
}

void qca808x_phy_exit(a_uint32_t dev_id, a_uint32_t port_bmp)
{
/*qca808x_end*/
	a_uint32_t port_id = 0;

	qca808x_phy_driver_unregister();
	for (port_id = 0; port_id < SW_MAX_NR_PORT; port_id ++)
	{
		if (port_bmp & (0x1 << port_id)) {
			qca808x_phydev_deinit(dev_id, port_id);
		}
	}
/*qca808x_start*/
}
/*qca808x_end*/
