38 vmxnet3_tq_dev_stats[] = {
57 {
" drv dropped tx total",
offsetof(
struct vmxnet3_tq_driver_stats,
59 {
" too many frags",
offsetof(
struct vmxnet3_tq_driver_stats,
60 drop_too_many_frags) },
61 {
" giant hdr",
offsetof(
struct vmxnet3_tq_driver_stats,
62 drop_oversized_hdr) },
63 {
" hdr err",
offsetof(
struct vmxnet3_tq_driver_stats,
64 drop_hdr_inspect_err) },
65 {
" tso",
offsetof(
struct vmxnet3_tq_driver_stats,
67 {
" ring full",
offsetof(
struct vmxnet3_tq_driver_stats,
69 {
" pkts linearized",
offsetof(
struct vmxnet3_tq_driver_stats,
71 {
" hdr cloned",
offsetof(
struct vmxnet3_tq_driver_stats,
73 {
" giant hdr",
offsetof(
struct vmxnet3_tq_driver_stats,
79 vmxnet3_rq_dev_stats[] = {
97 {
" drv dropped rx total",
offsetof(
struct vmxnet3_rq_driver_stats,
99 {
" err",
offsetof(
struct vmxnet3_rq_driver_stats,
101 {
" fcs",
offsetof(
struct vmxnet3_rq_driver_stats,
103 {
" rx buf alloc fail",
offsetof(
struct vmxnet3_rq_driver_stats,
104 rx_buf_alloc_failure) },
109 vmxnet3_global_stats[] = {
121 struct vmxnet3_tq_driver_stats *drvTxStats;
122 struct vmxnet3_rq_driver_stats *drvRxStats;
128 adapter = netdev_priv(netdev);
133 spin_unlock_irqrestore(&adapter->
cmd_lock, flags);
137 drvTxStats = &adapter->
tx_queue[
i].stats;
150 drvRxStats = &adapter->
rx_queue[
i].stats;
168 vmxnet3_get_sset_count(
struct net_device *netdev,
int sset)
187 #define NUM_TX_REGS 8
188 #define NUM_RX_REGS 12
191 vmxnet3_get_regs_len(
struct net_device *netdev)
214 drvinfo->
regdump_len = vmxnet3_get_regs_len(netdev);
225 for (i = 0; i <
ARRAY_SIZE(vmxnet3_tq_dev_stats); i++) {
230 for (i = 0; i <
ARRAY_SIZE(vmxnet3_tq_driver_stats);
239 for (i = 0; i <
ARRAY_SIZE(vmxnet3_rq_dev_stats); i++) {
244 for (i = 0; i <
ARRAY_SIZE(vmxnet3_rq_driver_stats);
252 for (i = 0; i <
ARRAY_SIZE(vmxnet3_global_stats); i++) {
268 adapter->
shared->devRead.misc.uptFeatures |=
271 adapter->
shared->devRead.misc.uptFeatures &=
276 adapter->
shared->devRead.misc.uptFeatures |=
279 adapter->
shared->devRead.misc.uptFeatures &=
283 adapter->
shared->devRead.misc.uptFeatures |=
286 adapter->
shared->devRead.misc.uptFeatures &=
292 spin_unlock_irqrestore(&adapter->
cmd_lock, flags);
298 vmxnet3_get_ethtool_stats(
struct net_device *netdev,
309 spin_unlock_irqrestore(&adapter->
cmd_lock, flags);
315 for (i = 1; i <
ARRAY_SIZE(vmxnet3_tq_dev_stats); i++)
316 *buf++ = *(
u64 *)(base +
317 vmxnet3_tq_dev_stats[
i].
offset);
321 *buf++ = *(
u64 *)(base +
322 vmxnet3_tq_driver_stats[
i].
offset);
328 for (i = 1; i <
ARRAY_SIZE(vmxnet3_rq_dev_stats); i++)
329 *buf++ = *(
u64 *)(base +
330 vmxnet3_rq_dev_stats[
i].
offset);
334 *buf++ = *(
u64 *)(base +
335 vmxnet3_rq_driver_stats[
i].
offset);
338 base = (
u8 *)adapter;
339 for (i = 0; i <
ARRAY_SIZE(vmxnet3_global_stats); i++)
340 *buf++ = *(
u64 *)(base + vmxnet3_global_stats[
i].
offset);
351 memset(p, 0, vmxnet3_get_regs_len(netdev));
359 buf[j++] = adapter->
tx_queue[
i].tx_ring.next2fill;
360 buf[j++] = adapter->
tx_queue[
i].tx_ring.next2comp;
361 buf[j++] = adapter->
tx_queue[
i].tx_ring.gen;
364 buf[j++] = adapter->
tx_queue[
i].comp_ring.next2proc;
365 buf[j++] = adapter->
tx_queue[
i].comp_ring.gen;
371 buf[j++] = adapter->
rx_queue[
i].rx_ring[0].next2fill;
372 buf[j++] = adapter->
rx_queue[
i].rx_ring[0].next2comp;
373 buf[j++] = adapter->
rx_queue[
i].rx_ring[0].gen;
376 buf[j++] = adapter->
rx_queue[
i].rx_ring[1].next2fill;
377 buf[j++] = adapter->
rx_queue[
i].rx_ring[1].next2comp;
378 buf[j++] = adapter->
rx_queue[
i].rx_ring[1].gen;
381 buf[j++] = adapter->
rx_queue[
i].comp_ring.next2proc;
382 buf[j++] = adapter->
rx_queue[
i].comp_ring.gen;
430 ethtool_cmd_speed_set(ecmd, adapter->
link_speed);
433 ethtool_cmd_speed_set(ecmd, -1);
441 vmxnet3_get_ringparam(
struct net_device *netdev,
461 vmxnet3_set_ringparam(
struct net_device *netdev,
465 u32 new_tx_ring_size, new_rx_ring_size;
481 new_tx_ring_size =
min_t(
u32, new_tx_ring_size,
491 new_rx_ring_size = (param->
rx_pending + sz - 1) / sz * sz;
492 new_rx_ring_size =
min_t(
u32, new_rx_ring_size,
498 if (new_tx_ring_size == adapter->
tx_queue[0].tx_ring.size &&
499 new_rx_ring_size == adapter->
rx_queue[0].rx_ring[0].size) {
510 if (netif_running(netdev)) {
526 " default ones\n", netdev->
name);
533 "with default sizes. Closing it\n",
542 " Closing it\n", netdev->
name, err);
569 vmxnet3_get_rss_indir_size(
struct net_device *netdev)
591 vmxnet3_set_rss_indir(
struct net_device *netdev,
const u32 *p)
604 spin_unlock_irqrestore(&adapter->
cmd_lock, flags);
611 static const struct ethtool_ops vmxnet3_ethtool_ops = {
612 .get_settings = vmxnet3_get_settings,
613 .get_drvinfo = vmxnet3_get_drvinfo,
614 .get_regs_len = vmxnet3_get_regs_len,
615 .get_regs = vmxnet3_get_regs,
616 .get_wol = vmxnet3_get_wol,
617 .set_wol = vmxnet3_set_wol,
619 .get_strings = vmxnet3_get_strings,
620 .get_sset_count = vmxnet3_get_sset_count,
621 .get_ethtool_stats = vmxnet3_get_ethtool_stats,
622 .get_ringparam = vmxnet3_get_ringparam,
623 .set_ringparam = vmxnet3_set_ringparam,
624 .get_rxnfc = vmxnet3_get_rxnfc,
626 .get_rxfh_indir_size = vmxnet3_get_rss_indir_size,
627 .get_rxfh_indir = vmxnet3_get_rss_indir,
628 .set_rxfh_indir = vmxnet3_set_rss_indir,