| #include <linux/ethtool.h> |
| #include <linux/netdevice.h> |
| #include <linux/pci.h> |
| |
| #include "fbnic.h" |
| #include "fbnic_netdev.h" |
| #include "fbnic_tlv.h" |
| |
| static void |
| fbnic_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) |
| { |
| struct fbnic_net *fbn = netdev_priv(netdev); |
| struct fbnic_dev *fbd = fbn->fbd; |
| |
| fbnic_get_fw_ver_commit_str(fbd, drvinfo->fw_version, |
| sizeof(drvinfo->fw_version)); |
| } |
| |
| static void fbnic_set_counter(u64 *stat, struct fbnic_stat_counter *counter) |
| { |
| if (counter->reported) |
| *stat = counter->value; |
| } |
| |
| static void |
| fbnic_get_eth_mac_stats(struct net_device *netdev, |
| struct ethtool_eth_mac_stats *eth_mac_stats) |
| { |
| struct fbnic_net *fbn = netdev_priv(netdev); |
| struct fbnic_mac_stats *mac_stats; |
| struct fbnic_dev *fbd = fbn->fbd; |
| const struct fbnic_mac *mac; |
| |
| mac_stats = &fbd->hw_stats.mac; |
| mac = fbd->mac; |
| |
| mac->get_eth_mac_stats(fbd, false, &mac_stats->eth_mac); |
| |
| fbnic_set_counter(ð_mac_stats->FramesTransmittedOK, |
| &mac_stats->eth_mac.FramesTransmittedOK); |
| fbnic_set_counter(ð_mac_stats->FramesReceivedOK, |
| &mac_stats->eth_mac.FramesReceivedOK); |
| fbnic_set_counter(ð_mac_stats->FrameCheckSequenceErrors, |
| &mac_stats->eth_mac.FrameCheckSequenceErrors); |
| fbnic_set_counter(ð_mac_stats->AlignmentErrors, |
| &mac_stats->eth_mac.AlignmentErrors); |
| fbnic_set_counter(ð_mac_stats->OctetsTransmittedOK, |
| &mac_stats->eth_mac.OctetsTransmittedOK); |
| fbnic_set_counter(ð_mac_stats->FramesLostDueToIntMACXmitError, |
| &mac_stats->eth_mac.FramesLostDueToIntMACXmitError); |
| fbnic_set_counter(ð_mac_stats->OctetsReceivedOK, |
| &mac_stats->eth_mac.OctetsReceivedOK); |
| fbnic_set_counter(ð_mac_stats->FramesLostDueToIntMACRcvError, |
| &mac_stats->eth_mac.FramesLostDueToIntMACRcvError); |
| fbnic_set_counter(ð_mac_stats->MulticastFramesXmittedOK, |
| &mac_stats->eth_mac.MulticastFramesXmittedOK); |
| fbnic_set_counter(ð_mac_stats->BroadcastFramesXmittedOK, |
| &mac_stats->eth_mac.BroadcastFramesXmittedOK); |
| fbnic_set_counter(ð_mac_stats->MulticastFramesReceivedOK, |
| &mac_stats->eth_mac.MulticastFramesReceivedOK); |
| fbnic_set_counter(ð_mac_stats->BroadcastFramesReceivedOK, |
| &mac_stats->eth_mac.BroadcastFramesReceivedOK); |
| fbnic_set_counter(ð_mac_stats->FrameTooLongErrors, |
| &mac_stats->eth_mac.FrameTooLongErrors); |
| } |
| |
| static const struct ethtool_ops fbnic_ethtool_ops = { |
| .get_drvinfo = fbnic_get_drvinfo, |
| .get_eth_mac_stats = fbnic_get_eth_mac_stats, |
| }; |
| |
| void fbnic_set_ethtool_ops(struct net_device *dev) |
| { |
| dev->ethtool_ops = &fbnic_ethtool_ops; |
| } |