static int hns3_get_link_ksettings(struct net_device *netdev, struct ethtool_link_ksettings *cmd) { struct hnae3_handle *h = hns3_get_handle(netdev); const struct hnae3_ae_ops *ops; u8 media_type; u8 link_stat; if (!h->ae_algo || !h->ae_algo->ops) return -EOPNOTSUPP; ops = h->ae_algo->ops; if (ops->get_media_type) ops->get_media_type(h, &media_type); else return -EOPNOTSUPP; switch (media_type) { case HNAE3_MEDIA_TYPE_NONE: cmd->base.port = PORT_NONE; hns3_get_ksettings(h, cmd); break; case HNAE3_MEDIA_TYPE_FIBER: cmd->base.port = PORT_FIBRE; hns3_get_ksettings(h, cmd); break; case HNAE3_MEDIA_TYPE_COPPER: cmd->base.port = PORT_TP; if (!netdev->phydev) hns3_get_ksettings(h, cmd); else phy_ethtool_ksettings_get(netdev->phydev, cmd); break; default: netdev_warn(netdev, "Unknown media type"); 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; }
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; 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; } if (h->ae_algo->ops->get_ksettings_an_result) h->ae_algo->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, 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, &cmd->base.eth_tp_mdix); /* 4.mdio_support */ cmd->base.mdio_support = ETH_MDIO_SUPPORTS_C22; /* 5.get flow control setttings */ if (h->ae_algo->ops->get_flowctrl_adv) h->ae_algo->ops->get_flowctrl_adv(h, &flowctrl_adv); if (flowctrl_adv & ADVERTISED_Pause) ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause); if (flowctrl_adv & ADVERTISED_Asym_Pause) ethtool_link_ksettings_add_link_mode(cmd, advertising, Asym_Pause); return 0; }