Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12f46bc1 authored by Jian Shen's avatar Jian Shen Committed by David S. Miller
Browse files

net: hns3: Refine hns3_get_link_ksettings()



In the previous implement, the query operation for fibre port and copper
port are mixed. This patch refines it by seperating them based on the port
type.

Signed-off-by: default avatarJian Shen <shenjian15@huawei.com>
Signed-off-by: default avatarPeng Li <lipeng321@huawei.com>
Signed-off-by: default avatarSalil Mehta <salil.mehta@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7a0a9284
Loading
Loading
Loading
Loading
+40 −28
Original line number Diff line number Diff line
@@ -546,51 +546,63 @@ static int hns3_get_link_ksettings(struct net_device *netdev,
				   struct ethtool_link_ksettings *cmd)
{
	struct hnae3_handle *h = hns3_get_handle(netdev);
	u32 flowctrl_adv = 0;
	const struct hnae3_ae_ops *ops;
	u8 link_stat;

	if (!h->ae_algo || !h->ae_algo->ops)
		return -EOPNOTSUPP;

	/* 1.auto_neg & speed & duplex from cmd */
	if (netdev->phydev) {
		phy_ethtool_ksettings_get(netdev->phydev, cmd);

		return 0;
	}
	ops = h->ae_algo->ops;
	if (ops->get_port_type)
		ops->get_port_type(h, &cmd->base.port);
	else
		return -EOPNOTSUPP;

	if (h->ae_algo->ops->get_ksettings_an_result)
		h->ae_algo->ops->get_ksettings_an_result(h,
	switch (cmd->base.port) {
	case PORT_FIBRE:
		/* 1.auto_neg & speed & duplex from cmd */
		if (ops->get_ksettings_an_result)
			ops->get_ksettings_an_result(h,
						     &cmd->base.autoneg,
						     &cmd->base.speed,
						     &cmd->base.duplex);
		else
			return -EOPNOTSUPP;

	link_stat = hns3_get_link(netdev);
	if (!link_stat) {
		cmd->base.speed = SPEED_UNKNOWN;
		cmd->base.duplex = DUPLEX_UNKNOWN;
	}

	/* 2.get link mode and port type*/
	if (h->ae_algo->ops->get_link_mode)
		h->ae_algo->ops->get_link_mode(h,
		/* 2.get link mode*/
		if (ops->get_link_mode)
			ops->get_link_mode(h,
					   cmd->link_modes.supported,
					   cmd->link_modes.advertising);

	cmd->base.port = PORT_NONE;
	if (h->ae_algo->ops->get_port_type)
		h->ae_algo->ops->get_port_type(h,
					       &cmd->base.port);

		/* 3.mdix_ctrl&mdix get from phy reg */
	if (h->ae_algo->ops->get_mdix_mode)
		h->ae_algo->ops->get_mdix_mode(h, &cmd->base.eth_tp_mdix_ctrl,
		if (ops->get_mdix_mode)
			ops->get_mdix_mode(h, &cmd->base.eth_tp_mdix_ctrl,
					   &cmd->base.eth_tp_mdix);
	/* 4.mdio_support */

		break;
	case PORT_TP:
		if (!netdev->phydev)
			return -EOPNOTSUPP;

		phy_ethtool_ksettings_get(netdev->phydev, cmd);

		break;
	default:
		netdev_warn(netdev,
			    "Unknown port type, neither Fibre/Copper detected");
		return 0;
	}

	/* mdio_support */
	cmd->base.mdio_support = ETH_MDIO_SUPPORTS_C22;

	link_stat = hns3_get_link(netdev);
	if (!link_stat) {
		cmd->base.speed = SPEED_UNKNOWN;
		cmd->base.duplex = DUPLEX_UNKNOWN;
	}

	return 0;
}