#include <linux/ethtool.h>
#include <linux/netdevice.h>
#include <linux/string.h>
+#include <linux/version.h>
#include "edma.h"
struct edma_ethtool_stats {
struct edma_adapter *adapter = netdev_priv(netdev);
if (adapter->poll_required) {
- struct phy_device *phydev = NULL;
- uint16_t phyreg;
-
if ((adapter->forced_speed != SPEED_UNKNOWN)
&& !(adapter->poll_required))
return -EPERM;
- phydev = adapter->phydev;
-
- linkmode_copy(cmd->link_modes.advertising, phydev->advertising);
- linkmode_copy(cmd->link_modes.supported, phydev->supported);
-
- cmd->base.autoneg = phydev->autoneg;
-
- if (adapter->link_state == __EDMA_LINKDOWN) {
- cmd->base.speed = SPEED_UNKNOWN;
- cmd->base.duplex = DUPLEX_UNKNOWN;
- } else {
- cmd->base.speed = phydev->speed;
- cmd->base.duplex = phydev->duplex;
- }
-
- cmd->base.phy_address = adapter->phy_mdio_addr;
-
- phyreg = (uint16_t)phy_read(adapter->phydev, MII_LPA);
- if (phyreg & LPA_10HALF)
- linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT,
- cmd->link_modes.lp_advertising);
-
- if (phyreg & LPA_10FULL)
- linkmode_set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
- cmd->link_modes.lp_advertising);
-
- if (phyreg & LPA_100HALF)
- linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT,
- cmd->link_modes.lp_advertising);
-
- if (phyreg & LPA_100FULL)
- linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
- cmd->link_modes.lp_advertising);
-
- phyreg = (uint16_t)phy_read(adapter->phydev, MII_STAT1000);
- if (phyreg & LPA_1000HALF)
- linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
- cmd->link_modes.lp_advertising);
-
- if (phyreg & LPA_1000FULL)
- linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
- cmd->link_modes.lp_advertising);
+ phy_ethtool_ksettings_get(adapter->phydev, cmd);
+ if (linkmode_test_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, adapter->phydev->advertising))
+ cmd->base.port = PORT_FIBRE;
+ else
+ cmd->base.port = PORT_TP;
} else {
/* If the speed/duplex for this GMAC is forced and we
* are not polling for link state changes, return the
const struct ethtool_link_ksettings *cmd)
{
struct edma_adapter *adapter = netdev_priv(netdev);
- struct phy_device *phydev = NULL;
if ((adapter->forced_speed != SPEED_UNKNOWN) &&
!adapter->poll_required)
return -EPERM;
- phydev = adapter->phydev;
- linkmode_copy(phydev->advertising, cmd->link_modes.advertising);
- linkmode_copy(phydev->supported, cmd->link_modes.supported);
- phydev->autoneg = cmd->base.autoneg;
- phydev->speed = cmd->base.speed;
- phydev->duplex = cmd->base.duplex;
-
- genphy_config_aneg(phydev);
-
- return 0;
+ return phy_ethtool_ksettings_set(adapter->phydev, cmd);
}
/* edma_get_coalesce
* get interrupt mitigation
*/
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0)
+static int edma_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec,
+ struct kernel_ethtool_coalesce *kernel_coal,
+ struct netlink_ext_ack *extack)
+#else
static int edma_get_coalesce(struct net_device *netdev,
struct ethtool_coalesce *ec)
+#endif
{
u32 reg_val;
/* edma_set_coalesce
* set interrupt mitigation
*/
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0)
+static int edma_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec,
+ struct kernel_ethtool_coalesce *kernel_coal,
+ struct netlink_ext_ack *extack)
+#else
static int edma_set_coalesce(struct net_device *netdev,
struct ethtool_coalesce *ec)
+#endif
{
if (ec->tx_coalesce_usecs)
edma_change_tx_coalesce(ec->tx_coalesce_usecs);
/* Ethtool operations
*/
static const struct ethtool_ops edma_ethtool_ops = {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,7,0)
+ .supported_coalesce_params = ETHTOOL_COALESCE_USECS,
+#endif
.get_drvinfo = &edma_get_drvinfo,
.get_link = ðtool_op_get_link,
.get_msglevel = &edma_get_msglevel,