|
@@ -1,5 +1,5 @@
|
|
-/* Intel Ethernet Switch Host Interface Driver
|
|
|
|
- * Copyright(c) 2013 - 2015 Intel Corporation.
|
|
|
|
|
|
+/* Intel(R) Ethernet Switch Host Interface Driver
|
|
|
|
+ * Copyright(c) 2013 - 2016 Intel Corporation.
|
|
*
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* under the terms and conditions of the GNU General Public License,
|
|
@@ -77,19 +77,6 @@ static const struct fm10k_stats fm10k_gstrings_global_stats[] = {
|
|
FM10K_STAT("mac_rules_avail", hw.swapi.mac.avail),
|
|
FM10K_STAT("mac_rules_avail", hw.swapi.mac.avail),
|
|
|
|
|
|
FM10K_STAT("tx_hang_count", tx_timeout_count),
|
|
FM10K_STAT("tx_hang_count", tx_timeout_count),
|
|
-
|
|
|
|
- FM10K_STAT("tx_hwtstamp_timeouts", tx_hwtstamp_timeouts),
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-static const struct fm10k_stats fm10k_gstrings_debug_stats[] = {
|
|
|
|
- FM10K_STAT("hw_sm_mbx_full", hw_sm_mbx_full),
|
|
|
|
- FM10K_STAT("hw_csum_tx_good", hw_csum_tx_good),
|
|
|
|
- FM10K_STAT("hw_csum_rx_good", hw_csum_rx_good),
|
|
|
|
- FM10K_STAT("rx_switch_errors", rx_switch_errors),
|
|
|
|
- FM10K_STAT("rx_drops", rx_drops),
|
|
|
|
- FM10K_STAT("rx_pp_errors", rx_pp_errors),
|
|
|
|
- FM10K_STAT("rx_link_errors", rx_link_errors),
|
|
|
|
- FM10K_STAT("rx_length_errors", rx_length_errors),
|
|
|
|
};
|
|
};
|
|
|
|
|
|
static const struct fm10k_stats fm10k_gstrings_pf_stats[] = {
|
|
static const struct fm10k_stats fm10k_gstrings_pf_stats[] = {
|
|
@@ -121,13 +108,21 @@ static const struct fm10k_stats fm10k_gstrings_mbx_stats[] = {
|
|
FM10K_MBX_STAT("mbx_rx_mbmem_pushed", rx_mbmem_pushed),
|
|
FM10K_MBX_STAT("mbx_rx_mbmem_pushed", rx_mbmem_pushed),
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+#define FM10K_QUEUE_STAT(_name, _stat) { \
|
|
|
|
+ .stat_string = _name, \
|
|
|
|
+ .sizeof_stat = FIELD_SIZEOF(struct fm10k_ring, _stat), \
|
|
|
|
+ .stat_offset = offsetof(struct fm10k_ring, _stat) \
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static const struct fm10k_stats fm10k_gstrings_queue_stats[] = {
|
|
|
|
+ FM10K_QUEUE_STAT("packets", stats.packets),
|
|
|
|
+ FM10K_QUEUE_STAT("bytes", stats.bytes),
|
|
|
|
+};
|
|
|
|
+
|
|
#define FM10K_GLOBAL_STATS_LEN ARRAY_SIZE(fm10k_gstrings_global_stats)
|
|
#define FM10K_GLOBAL_STATS_LEN ARRAY_SIZE(fm10k_gstrings_global_stats)
|
|
-#define FM10K_DEBUG_STATS_LEN ARRAY_SIZE(fm10k_gstrings_debug_stats)
|
|
|
|
#define FM10K_PF_STATS_LEN ARRAY_SIZE(fm10k_gstrings_pf_stats)
|
|
#define FM10K_PF_STATS_LEN ARRAY_SIZE(fm10k_gstrings_pf_stats)
|
|
#define FM10K_MBX_STATS_LEN ARRAY_SIZE(fm10k_gstrings_mbx_stats)
|
|
#define FM10K_MBX_STATS_LEN ARRAY_SIZE(fm10k_gstrings_mbx_stats)
|
|
-
|
|
|
|
-#define FM10K_QUEUE_STATS_LEN(_n) \
|
|
|
|
- ((_n) * 2 * (sizeof(struct fm10k_queue_stats) / sizeof(u64)))
|
|
|
|
|
|
+#define FM10K_QUEUE_STATS_LEN ARRAY_SIZE(fm10k_gstrings_queue_stats)
|
|
|
|
|
|
#define FM10K_STATIC_STATS_LEN (FM10K_GLOBAL_STATS_LEN + \
|
|
#define FM10K_STATIC_STATS_LEN (FM10K_GLOBAL_STATS_LEN + \
|
|
FM10K_NETDEV_STATS_LEN + \
|
|
FM10K_NETDEV_STATS_LEN + \
|
|
@@ -145,12 +140,10 @@ enum fm10k_self_test_types {
|
|
};
|
|
};
|
|
|
|
|
|
enum {
|
|
enum {
|
|
- FM10K_PRV_FLAG_DEBUG_STATS,
|
|
|
|
FM10K_PRV_FLAG_LEN,
|
|
FM10K_PRV_FLAG_LEN,
|
|
};
|
|
};
|
|
|
|
|
|
static const char fm10k_prv_flags[FM10K_PRV_FLAG_LEN][ETH_GSTRING_LEN] = {
|
|
static const char fm10k_prv_flags[FM10K_PRV_FLAG_LEN][ETH_GSTRING_LEN] = {
|
|
- "debug-statistics",
|
|
|
|
};
|
|
};
|
|
|
|
|
|
static void fm10k_add_stat_strings(char **p, const char *prefix,
|
|
static void fm10k_add_stat_strings(char **p, const char *prefix,
|
|
@@ -169,7 +162,6 @@ static void fm10k_add_stat_strings(char **p, const char *prefix,
|
|
static void fm10k_get_stat_strings(struct net_device *dev, u8 *data)
|
|
static void fm10k_get_stat_strings(struct net_device *dev, u8 *data)
|
|
{
|
|
{
|
|
struct fm10k_intfc *interface = netdev_priv(dev);
|
|
struct fm10k_intfc *interface = netdev_priv(dev);
|
|
- struct fm10k_iov_data *iov_data = interface->iov_data;
|
|
|
|
char *p = (char *)data;
|
|
char *p = (char *)data;
|
|
unsigned int i;
|
|
unsigned int i;
|
|
|
|
|
|
@@ -179,10 +171,6 @@ static void fm10k_get_stat_strings(struct net_device *dev, u8 *data)
|
|
fm10k_add_stat_strings(&p, "", fm10k_gstrings_global_stats,
|
|
fm10k_add_stat_strings(&p, "", fm10k_gstrings_global_stats,
|
|
FM10K_GLOBAL_STATS_LEN);
|
|
FM10K_GLOBAL_STATS_LEN);
|
|
|
|
|
|
- if (interface->flags & FM10K_FLAG_DEBUG_STATS)
|
|
|
|
- fm10k_add_stat_strings(&p, "", fm10k_gstrings_debug_stats,
|
|
|
|
- FM10K_DEBUG_STATS_LEN);
|
|
|
|
-
|
|
|
|
fm10k_add_stat_strings(&p, "", fm10k_gstrings_mbx_stats,
|
|
fm10k_add_stat_strings(&p, "", fm10k_gstrings_mbx_stats,
|
|
FM10K_MBX_STATS_LEN);
|
|
FM10K_MBX_STATS_LEN);
|
|
|
|
|
|
@@ -190,26 +178,18 @@ static void fm10k_get_stat_strings(struct net_device *dev, u8 *data)
|
|
fm10k_add_stat_strings(&p, "", fm10k_gstrings_pf_stats,
|
|
fm10k_add_stat_strings(&p, "", fm10k_gstrings_pf_stats,
|
|
FM10K_PF_STATS_LEN);
|
|
FM10K_PF_STATS_LEN);
|
|
|
|
|
|
- if ((interface->flags & FM10K_FLAG_DEBUG_STATS) && iov_data) {
|
|
|
|
- for (i = 0; i < iov_data->num_vfs; i++) {
|
|
|
|
- char prefix[ETH_GSTRING_LEN];
|
|
|
|
|
|
+ for (i = 0; i < interface->hw.mac.max_queues; i++) {
|
|
|
|
+ char prefix[ETH_GSTRING_LEN];
|
|
|
|
|
|
- snprintf(prefix, ETH_GSTRING_LEN, "vf_%u_", i);
|
|
|
|
- fm10k_add_stat_strings(&p, prefix,
|
|
|
|
- fm10k_gstrings_mbx_stats,
|
|
|
|
- FM10K_MBX_STATS_LEN);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ snprintf(prefix, ETH_GSTRING_LEN, "tx_queue_%u_", i);
|
|
|
|
+ fm10k_add_stat_strings(&p, prefix,
|
|
|
|
+ fm10k_gstrings_queue_stats,
|
|
|
|
+ FM10K_QUEUE_STATS_LEN);
|
|
|
|
|
|
- for (i = 0; i < interface->hw.mac.max_queues; i++) {
|
|
|
|
- snprintf(p, ETH_GSTRING_LEN, "tx_queue_%u_packets", i);
|
|
|
|
- p += ETH_GSTRING_LEN;
|
|
|
|
- snprintf(p, ETH_GSTRING_LEN, "tx_queue_%u_bytes", i);
|
|
|
|
- p += ETH_GSTRING_LEN;
|
|
|
|
- snprintf(p, ETH_GSTRING_LEN, "rx_queue_%u_packets", i);
|
|
|
|
- p += ETH_GSTRING_LEN;
|
|
|
|
- snprintf(p, ETH_GSTRING_LEN, "rx_queue_%u_bytes", i);
|
|
|
|
- p += ETH_GSTRING_LEN;
|
|
|
|
|
|
+ snprintf(prefix, ETH_GSTRING_LEN, "rx_queue_%u_", i);
|
|
|
|
+ fm10k_add_stat_strings(&p, prefix,
|
|
|
|
+ fm10k_gstrings_queue_stats,
|
|
|
|
+ FM10K_QUEUE_STATS_LEN);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -236,7 +216,6 @@ static void fm10k_get_strings(struct net_device *dev,
|
|
static int fm10k_get_sset_count(struct net_device *dev, int sset)
|
|
static int fm10k_get_sset_count(struct net_device *dev, int sset)
|
|
{
|
|
{
|
|
struct fm10k_intfc *interface = netdev_priv(dev);
|
|
struct fm10k_intfc *interface = netdev_priv(dev);
|
|
- struct fm10k_iov_data *iov_data = interface->iov_data;
|
|
|
|
struct fm10k_hw *hw = &interface->hw;
|
|
struct fm10k_hw *hw = &interface->hw;
|
|
int stats_len = FM10K_STATIC_STATS_LEN;
|
|
int stats_len = FM10K_STATIC_STATS_LEN;
|
|
|
|
|
|
@@ -244,19 +223,11 @@ static int fm10k_get_sset_count(struct net_device *dev, int sset)
|
|
case ETH_SS_TEST:
|
|
case ETH_SS_TEST:
|
|
return FM10K_TEST_LEN;
|
|
return FM10K_TEST_LEN;
|
|
case ETH_SS_STATS:
|
|
case ETH_SS_STATS:
|
|
- stats_len += FM10K_QUEUE_STATS_LEN(hw->mac.max_queues);
|
|
|
|
|
|
+ stats_len += hw->mac.max_queues * 2 * FM10K_QUEUE_STATS_LEN;
|
|
|
|
|
|
if (hw->mac.type != fm10k_mac_vf)
|
|
if (hw->mac.type != fm10k_mac_vf)
|
|
stats_len += FM10K_PF_STATS_LEN;
|
|
stats_len += FM10K_PF_STATS_LEN;
|
|
|
|
|
|
- if (interface->flags & FM10K_FLAG_DEBUG_STATS) {
|
|
|
|
- stats_len += FM10K_DEBUG_STATS_LEN;
|
|
|
|
-
|
|
|
|
- if (iov_data)
|
|
|
|
- stats_len += FM10K_MBX_STATS_LEN *
|
|
|
|
- iov_data->num_vfs;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
return stats_len;
|
|
return stats_len;
|
|
case ETH_SS_PRIV_FLAGS:
|
|
case ETH_SS_PRIV_FLAGS:
|
|
return FM10K_PRV_FLAG_LEN;
|
|
return FM10K_PRV_FLAG_LEN;
|
|
@@ -272,9 +243,10 @@ static void fm10k_add_ethtool_stats(u64 **data, void *pointer,
|
|
unsigned int i;
|
|
unsigned int i;
|
|
char *p;
|
|
char *p;
|
|
|
|
|
|
- /* simply skip forward if we were not given a valid pointer */
|
|
|
|
if (!pointer) {
|
|
if (!pointer) {
|
|
- *data += size;
|
|
|
|
|
|
+ /* memory is not zero allocated so we have to clear it */
|
|
|
|
+ for (i = 0; i < size; i++)
|
|
|
|
+ *((*data)++) = 0;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -304,11 +276,9 @@ static void fm10k_get_ethtool_stats(struct net_device *netdev,
|
|
struct ethtool_stats __always_unused *stats,
|
|
struct ethtool_stats __always_unused *stats,
|
|
u64 *data)
|
|
u64 *data)
|
|
{
|
|
{
|
|
- const int stat_count = sizeof(struct fm10k_queue_stats) / sizeof(u64);
|
|
|
|
struct fm10k_intfc *interface = netdev_priv(netdev);
|
|
struct fm10k_intfc *interface = netdev_priv(netdev);
|
|
- struct fm10k_iov_data *iov_data = interface->iov_data;
|
|
|
|
struct net_device_stats *net_stats = &netdev->stats;
|
|
struct net_device_stats *net_stats = &netdev->stats;
|
|
- int i, j;
|
|
|
|
|
|
+ int i;
|
|
|
|
|
|
fm10k_update_stats(interface);
|
|
fm10k_update_stats(interface);
|
|
|
|
|
|
@@ -318,11 +288,6 @@ static void fm10k_get_ethtool_stats(struct net_device *netdev,
|
|
fm10k_add_ethtool_stats(&data, interface, fm10k_gstrings_global_stats,
|
|
fm10k_add_ethtool_stats(&data, interface, fm10k_gstrings_global_stats,
|
|
FM10K_GLOBAL_STATS_LEN);
|
|
FM10K_GLOBAL_STATS_LEN);
|
|
|
|
|
|
- if (interface->flags & FM10K_FLAG_DEBUG_STATS)
|
|
|
|
- fm10k_add_ethtool_stats(&data, interface,
|
|
|
|
- fm10k_gstrings_debug_stats,
|
|
|
|
- FM10K_DEBUG_STATS_LEN);
|
|
|
|
-
|
|
|
|
fm10k_add_ethtool_stats(&data, &interface->hw.mbx,
|
|
fm10k_add_ethtool_stats(&data, &interface->hw.mbx,
|
|
fm10k_gstrings_mbx_stats,
|
|
fm10k_gstrings_mbx_stats,
|
|
FM10K_MBX_STATS_LEN);
|
|
FM10K_MBX_STATS_LEN);
|
|
@@ -333,33 +298,18 @@ static void fm10k_get_ethtool_stats(struct net_device *netdev,
|
|
FM10K_PF_STATS_LEN);
|
|
FM10K_PF_STATS_LEN);
|
|
}
|
|
}
|
|
|
|
|
|
- if ((interface->flags & FM10K_FLAG_DEBUG_STATS) && iov_data) {
|
|
|
|
- for (i = 0; i < iov_data->num_vfs; i++) {
|
|
|
|
- struct fm10k_vf_info *vf_info;
|
|
|
|
-
|
|
|
|
- vf_info = &iov_data->vf_info[i];
|
|
|
|
-
|
|
|
|
- fm10k_add_ethtool_stats(&data, &vf_info->mbx,
|
|
|
|
- fm10k_gstrings_mbx_stats,
|
|
|
|
- FM10K_MBX_STATS_LEN);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
for (i = 0; i < interface->hw.mac.max_queues; i++) {
|
|
for (i = 0; i < interface->hw.mac.max_queues; i++) {
|
|
struct fm10k_ring *ring;
|
|
struct fm10k_ring *ring;
|
|
- u64 *queue_stat;
|
|
|
|
|
|
|
|
ring = interface->tx_ring[i];
|
|
ring = interface->tx_ring[i];
|
|
- if (ring)
|
|
|
|
- queue_stat = (u64 *)&ring->stats;
|
|
|
|
- for (j = 0; j < stat_count; j++)
|
|
|
|
- *(data++) = ring ? queue_stat[j] : 0;
|
|
|
|
|
|
+ fm10k_add_ethtool_stats(&data, ring,
|
|
|
|
+ fm10k_gstrings_queue_stats,
|
|
|
|
+ FM10K_QUEUE_STATS_LEN);
|
|
|
|
|
|
ring = interface->rx_ring[i];
|
|
ring = interface->rx_ring[i];
|
|
- if (ring)
|
|
|
|
- queue_stat = (u64 *)&ring->stats;
|
|
|
|
- for (j = 0; j < stat_count; j++)
|
|
|
|
- *(data++) = ring ? queue_stat[j] : 0;
|
|
|
|
|
|
+ fm10k_add_ethtool_stats(&data, ring,
|
|
|
|
+ fm10k_gstrings_queue_stats,
|
|
|
|
+ FM10K_QUEUE_STATS_LEN);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1003,27 +953,14 @@ static void fm10k_self_test(struct net_device *dev,
|
|
|
|
|
|
static u32 fm10k_get_priv_flags(struct net_device *netdev)
|
|
static u32 fm10k_get_priv_flags(struct net_device *netdev)
|
|
{
|
|
{
|
|
- struct fm10k_intfc *interface = netdev_priv(netdev);
|
|
|
|
- u32 priv_flags = 0;
|
|
|
|
-
|
|
|
|
- if (interface->flags & FM10K_FLAG_DEBUG_STATS)
|
|
|
|
- priv_flags |= BIT(FM10K_PRV_FLAG_DEBUG_STATS);
|
|
|
|
-
|
|
|
|
- return priv_flags;
|
|
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
static int fm10k_set_priv_flags(struct net_device *netdev, u32 priv_flags)
|
|
static int fm10k_set_priv_flags(struct net_device *netdev, u32 priv_flags)
|
|
{
|
|
{
|
|
- struct fm10k_intfc *interface = netdev_priv(netdev);
|
|
|
|
-
|
|
|
|
if (priv_flags >= BIT(FM10K_PRV_FLAG_LEN))
|
|
if (priv_flags >= BIT(FM10K_PRV_FLAG_LEN))
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
- if (priv_flags & BIT(FM10K_PRV_FLAG_DEBUG_STATS))
|
|
|
|
- interface->flags |= FM10K_FLAG_DEBUG_STATS;
|
|
|
|
- else
|
|
|
|
- interface->flags &= ~FM10K_FLAG_DEBUG_STATS;
|
|
|
|
-
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1034,15 +971,29 @@ u32 fm10k_get_reta_size(struct net_device __always_unused *netdev)
|
|
|
|
|
|
void fm10k_write_reta(struct fm10k_intfc *interface, const u32 *indir)
|
|
void fm10k_write_reta(struct fm10k_intfc *interface, const u32 *indir)
|
|
{
|
|
{
|
|
|
|
+ u16 rss_i = interface->ring_feature[RING_F_RSS].indices;
|
|
struct fm10k_hw *hw = &interface->hw;
|
|
struct fm10k_hw *hw = &interface->hw;
|
|
- int i;
|
|
|
|
|
|
+ u32 table[4];
|
|
|
|
+ int i, j;
|
|
|
|
|
|
/* record entries to reta table */
|
|
/* record entries to reta table */
|
|
- for (i = 0; i < FM10K_RETA_SIZE; i++, indir += 4) {
|
|
|
|
- u32 reta = indir[0] |
|
|
|
|
- (indir[1] << 8) |
|
|
|
|
- (indir[2] << 16) |
|
|
|
|
- (indir[3] << 24);
|
|
|
|
|
|
+ for (i = 0; i < FM10K_RETA_SIZE; i++) {
|
|
|
|
+ u32 reta, n;
|
|
|
|
+
|
|
|
|
+ /* generate a new table if we weren't given one */
|
|
|
|
+ for (j = 0; j < 4; j++) {
|
|
|
|
+ if (indir)
|
|
|
|
+ n = indir[i + j];
|
|
|
|
+ else
|
|
|
|
+ n = ethtool_rxfh_indir_default(i + j, rss_i);
|
|
|
|
+
|
|
|
|
+ table[j] = n;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ reta = table[0] |
|
|
|
|
+ (table[1] << 8) |
|
|
|
|
+ (table[2] << 16) |
|
|
|
|
+ (table[3] << 24);
|
|
|
|
|
|
if (interface->reta[i] == reta)
|
|
if (interface->reta[i] == reta)
|
|
continue;
|
|
continue;
|
|
@@ -1201,31 +1152,6 @@ static int fm10k_set_channels(struct net_device *dev,
|
|
return fm10k_setup_tc(dev, netdev_get_num_tc(dev));
|
|
return fm10k_setup_tc(dev, netdev_get_num_tc(dev));
|
|
}
|
|
}
|
|
|
|
|
|
-static int fm10k_get_ts_info(struct net_device *dev,
|
|
|
|
- struct ethtool_ts_info *info)
|
|
|
|
-{
|
|
|
|
- struct fm10k_intfc *interface = netdev_priv(dev);
|
|
|
|
-
|
|
|
|
- info->so_timestamping =
|
|
|
|
- SOF_TIMESTAMPING_TX_SOFTWARE |
|
|
|
|
- SOF_TIMESTAMPING_RX_SOFTWARE |
|
|
|
|
- SOF_TIMESTAMPING_SOFTWARE |
|
|
|
|
- SOF_TIMESTAMPING_TX_HARDWARE |
|
|
|
|
- SOF_TIMESTAMPING_RX_HARDWARE |
|
|
|
|
- SOF_TIMESTAMPING_RAW_HARDWARE;
|
|
|
|
-
|
|
|
|
- if (interface->ptp_clock)
|
|
|
|
- info->phc_index = ptp_clock_index(interface->ptp_clock);
|
|
|
|
- else
|
|
|
|
- info->phc_index = -1;
|
|
|
|
-
|
|
|
|
- info->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ON);
|
|
|
|
-
|
|
|
|
- info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) | BIT(HWTSTAMP_FILTER_ALL);
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static const struct ethtool_ops fm10k_ethtool_ops = {
|
|
static const struct ethtool_ops fm10k_ethtool_ops = {
|
|
.get_strings = fm10k_get_strings,
|
|
.get_strings = fm10k_get_strings,
|
|
.get_sset_count = fm10k_get_sset_count,
|
|
.get_sset_count = fm10k_get_sset_count,
|
|
@@ -1253,7 +1179,6 @@ static const struct ethtool_ops fm10k_ethtool_ops = {
|
|
.set_rxfh = fm10k_set_rssh,
|
|
.set_rxfh = fm10k_set_rssh,
|
|
.get_channels = fm10k_get_channels,
|
|
.get_channels = fm10k_get_channels,
|
|
.set_channels = fm10k_set_channels,
|
|
.set_channels = fm10k_set_channels,
|
|
- .get_ts_info = fm10k_get_ts_info,
|
|
|
|
};
|
|
};
|
|
|
|
|
|
void fm10k_set_ethtool_ops(struct net_device *dev)
|
|
void fm10k_set_ethtool_ops(struct net_device *dev)
|