Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netdevsim: add FEC settings support

Add support for ethtool FEC and some ethtool error injection.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jakub Kicinski and committed by
David S. Miller
0d7f76dc 1e5d1f69

+39
+36
drivers/net/netdevsim/ethtool.c
··· 77 77 return 0; 78 78 } 79 79 80 + static int 81 + nsim_get_fecparam(struct net_device *dev, struct ethtool_fecparam *fecparam) 82 + { 83 + struct netdevsim *ns = netdev_priv(dev); 84 + 85 + if (ns->ethtool.get_err) 86 + return -ns->ethtool.get_err; 87 + memcpy(fecparam, &ns->ethtool.fec, sizeof(ns->ethtool.fec)); 88 + return 0; 89 + } 90 + 91 + static int 92 + nsim_set_fecparam(struct net_device *dev, struct ethtool_fecparam *fecparam) 93 + { 94 + struct netdevsim *ns = netdev_priv(dev); 95 + u32 fec; 96 + 97 + if (ns->ethtool.set_err) 98 + return -ns->ethtool.set_err; 99 + memcpy(&ns->ethtool.fec, fecparam, sizeof(ns->ethtool.fec)); 100 + fec = fecparam->fec; 101 + if (fec == ETHTOOL_FEC_AUTO) 102 + fec |= ETHTOOL_FEC_OFF; 103 + fec |= ETHTOOL_FEC_NONE; 104 + ns->ethtool.fec.active_fec = 1 << (fls(fec) - 1); 105 + return 0; 106 + } 107 + 80 108 static const struct ethtool_ops nsim_ethtool_ops = { 81 109 .supported_coalesce_params = ETHTOOL_COALESCE_ALL_PARAMS, 82 110 .get_pause_stats = nsim_get_pause_stats, ··· 114 86 .get_coalesce = nsim_get_coalesce, 115 87 .get_ringparam = nsim_get_ringparam, 116 88 .set_ringparam = nsim_set_ringparam, 89 + .get_fecparam = nsim_get_fecparam, 90 + .set_fecparam = nsim_set_fecparam, 117 91 }; 118 92 119 93 static void nsim_ethtool_ring_init(struct netdevsim *ns) ··· 134 104 135 105 nsim_ethtool_ring_init(ns); 136 106 107 + ns->ethtool.fec.fec = ETHTOOL_FEC_NONE; 108 + ns->ethtool.fec.active_fec = ETHTOOL_FEC_NONE; 109 + 137 110 ethtool = debugfs_create_dir("ethtool", ns->nsim_dev_port->ddir); 111 + 112 + debugfs_create_u32("get_err", 0600, ethtool, &ns->ethtool.get_err); 113 + debugfs_create_u32("set_err", 0600, ethtool, &ns->ethtool.set_err); 138 114 139 115 dir = debugfs_create_dir("pause", ethtool); 140 116 debugfs_create_bool("report_stats_rx", 0600, dir,
+3
drivers/net/netdevsim/netdevsim.h
··· 60 60 }; 61 61 62 62 struct nsim_ethtool { 63 + u32 get_err; 64 + u32 set_err; 63 65 struct nsim_ethtool_pauseparam pauseparam; 64 66 struct ethtool_coalesce coalesce; 65 67 struct ethtool_ringparam ring; 68 + struct ethtool_fecparam fec; 66 69 }; 67 70 68 71 struct netdevsim {