vmxnet3_ethtool.c (36490B)
1/* 2 * Linux driver for VMware's vmxnet3 ethernet NIC. 3 * 4 * Copyright (C) 2008-2021, VMware, Inc. All Rights Reserved. 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License as published by the 8 * Free Software Foundation; version 2 of the License and no later version. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 13 * NON INFRINGEMENT. See the GNU General Public License for more 14 * details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * The full GNU General Public License is included in this distribution in 21 * the file called "COPYING". 22 * 23 * Maintained by: pv-drivers@vmware.com 24 * 25 */ 26 27 28#include "vmxnet3_int.h" 29#include <net/vxlan.h> 30#include <net/geneve.h> 31 32#define VXLAN_UDP_PORT 8472 33 34struct vmxnet3_stat_desc { 35 char desc[ETH_GSTRING_LEN]; 36 int offset; 37}; 38 39 40/* per tq stats maintained by the device */ 41static const struct vmxnet3_stat_desc 42vmxnet3_tq_dev_stats[] = { 43 /* description, offset */ 44 { "Tx Queue#", 0 }, 45 { " TSO pkts tx", offsetof(struct UPT1_TxStats, TSOPktsTxOK) }, 46 { " TSO bytes tx", offsetof(struct UPT1_TxStats, TSOBytesTxOK) }, 47 { " ucast pkts tx", offsetof(struct UPT1_TxStats, ucastPktsTxOK) }, 48 { " ucast bytes tx", offsetof(struct UPT1_TxStats, ucastBytesTxOK) }, 49 { " mcast pkts tx", offsetof(struct UPT1_TxStats, mcastPktsTxOK) }, 50 { " mcast bytes tx", offsetof(struct UPT1_TxStats, mcastBytesTxOK) }, 51 { " bcast pkts tx", offsetof(struct UPT1_TxStats, bcastPktsTxOK) }, 52 { " bcast bytes tx", offsetof(struct UPT1_TxStats, bcastBytesTxOK) }, 53 { " pkts tx err", offsetof(struct UPT1_TxStats, pktsTxError) }, 54 { " pkts tx discard", offsetof(struct UPT1_TxStats, pktsTxDiscard) }, 55}; 56 57/* per tq stats maintained by the driver */ 58static const struct vmxnet3_stat_desc 59vmxnet3_tq_driver_stats[] = { 60 /* description, offset */ 61 {" drv dropped tx total", offsetof(struct vmxnet3_tq_driver_stats, 62 drop_total) }, 63 { " too many frags", offsetof(struct vmxnet3_tq_driver_stats, 64 drop_too_many_frags) }, 65 { " giant hdr", offsetof(struct vmxnet3_tq_driver_stats, 66 drop_oversized_hdr) }, 67 { " hdr err", offsetof(struct vmxnet3_tq_driver_stats, 68 drop_hdr_inspect_err) }, 69 { " tso", offsetof(struct vmxnet3_tq_driver_stats, 70 drop_tso) }, 71 { " ring full", offsetof(struct vmxnet3_tq_driver_stats, 72 tx_ring_full) }, 73 { " pkts linearized", offsetof(struct vmxnet3_tq_driver_stats, 74 linearized) }, 75 { " hdr cloned", offsetof(struct vmxnet3_tq_driver_stats, 76 copy_skb_header) }, 77 { " giant hdr", offsetof(struct vmxnet3_tq_driver_stats, 78 oversized_hdr) }, 79}; 80 81/* per rq stats maintained by the device */ 82static const struct vmxnet3_stat_desc 83vmxnet3_rq_dev_stats[] = { 84 { "Rx Queue#", 0 }, 85 { " LRO pkts rx", offsetof(struct UPT1_RxStats, LROPktsRxOK) }, 86 { " LRO byte rx", offsetof(struct UPT1_RxStats, LROBytesRxOK) }, 87 { " ucast pkts rx", offsetof(struct UPT1_RxStats, ucastPktsRxOK) }, 88 { " ucast bytes rx", offsetof(struct UPT1_RxStats, ucastBytesRxOK) }, 89 { " mcast pkts rx", offsetof(struct UPT1_RxStats, mcastPktsRxOK) }, 90 { " mcast bytes rx", offsetof(struct UPT1_RxStats, mcastBytesRxOK) }, 91 { " bcast pkts rx", offsetof(struct UPT1_RxStats, bcastPktsRxOK) }, 92 { " bcast bytes rx", offsetof(struct UPT1_RxStats, bcastBytesRxOK) }, 93 { " pkts rx OOB", offsetof(struct UPT1_RxStats, pktsRxOutOfBuf) }, 94 { " pkts rx err", offsetof(struct UPT1_RxStats, pktsRxError) }, 95}; 96 97/* per rq stats maintained by the driver */ 98static const struct vmxnet3_stat_desc 99vmxnet3_rq_driver_stats[] = { 100 /* description, offset */ 101 { " drv dropped rx total", offsetof(struct vmxnet3_rq_driver_stats, 102 drop_total) }, 103 { " err", offsetof(struct vmxnet3_rq_driver_stats, 104 drop_err) }, 105 { " fcs", offsetof(struct vmxnet3_rq_driver_stats, 106 drop_fcs) }, 107 { " rx buf alloc fail", offsetof(struct vmxnet3_rq_driver_stats, 108 rx_buf_alloc_failure) }, 109}; 110 111/* global stats maintained by the driver */ 112static const struct vmxnet3_stat_desc 113vmxnet3_global_stats[] = { 114 /* description, offset */ 115 { "tx timeout count", offsetof(struct vmxnet3_adapter, 116 tx_timeout_count) } 117}; 118 119 120void 121vmxnet3_get_stats64(struct net_device *netdev, 122 struct rtnl_link_stats64 *stats) 123{ 124 struct vmxnet3_adapter *adapter; 125 struct vmxnet3_tq_driver_stats *drvTxStats; 126 struct vmxnet3_rq_driver_stats *drvRxStats; 127 struct UPT1_TxStats *devTxStats; 128 struct UPT1_RxStats *devRxStats; 129 unsigned long flags; 130 int i; 131 132 adapter = netdev_priv(netdev); 133 134 /* Collect the dev stats into the shared area */ 135 spin_lock_irqsave(&adapter->cmd_lock, flags); 136 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS); 137 spin_unlock_irqrestore(&adapter->cmd_lock, flags); 138 139 for (i = 0; i < adapter->num_tx_queues; i++) { 140 devTxStats = &adapter->tqd_start[i].stats; 141 drvTxStats = &adapter->tx_queue[i].stats; 142 stats->tx_packets += devTxStats->ucastPktsTxOK + 143 devTxStats->mcastPktsTxOK + 144 devTxStats->bcastPktsTxOK; 145 stats->tx_bytes += devTxStats->ucastBytesTxOK + 146 devTxStats->mcastBytesTxOK + 147 devTxStats->bcastBytesTxOK; 148 stats->tx_errors += devTxStats->pktsTxError; 149 stats->tx_dropped += drvTxStats->drop_total; 150 } 151 152 for (i = 0; i < adapter->num_rx_queues; i++) { 153 devRxStats = &adapter->rqd_start[i].stats; 154 drvRxStats = &adapter->rx_queue[i].stats; 155 stats->rx_packets += devRxStats->ucastPktsRxOK + 156 devRxStats->mcastPktsRxOK + 157 devRxStats->bcastPktsRxOK; 158 159 stats->rx_bytes += devRxStats->ucastBytesRxOK + 160 devRxStats->mcastBytesRxOK + 161 devRxStats->bcastBytesRxOK; 162 163 stats->rx_errors += devRxStats->pktsRxError; 164 stats->rx_dropped += drvRxStats->drop_total; 165 stats->multicast += devRxStats->mcastPktsRxOK; 166 } 167} 168 169static int 170vmxnet3_get_sset_count(struct net_device *netdev, int sset) 171{ 172 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 173 switch (sset) { 174 case ETH_SS_STATS: 175 return (ARRAY_SIZE(vmxnet3_tq_dev_stats) + 176 ARRAY_SIZE(vmxnet3_tq_driver_stats)) * 177 adapter->num_tx_queues + 178 (ARRAY_SIZE(vmxnet3_rq_dev_stats) + 179 ARRAY_SIZE(vmxnet3_rq_driver_stats)) * 180 adapter->num_rx_queues + 181 ARRAY_SIZE(vmxnet3_global_stats); 182 default: 183 return -EOPNOTSUPP; 184 } 185} 186 187 188/* This is a version 2 of the vmxnet3 ethtool_regs which goes hand in hand with 189 * the version 2 of the vmxnet3 support for ethtool(8) --register-dump. 190 * Therefore, if any registers are added, removed or modified, then a version 191 * bump and a corresponding change in the vmxnet3 support for ethtool(8) 192 * --register-dump would be required. 193 */ 194static int 195vmxnet3_get_regs_len(struct net_device *netdev) 196{ 197 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 198 199 return ((9 /* BAR1 registers */ + 200 (1 + adapter->intr.num_intrs) + 201 (1 + adapter->num_tx_queues * 17 /* Tx queue registers */) + 202 (1 + adapter->num_rx_queues * 23 /* Rx queue registers */)) * 203 sizeof(u32)); 204} 205 206 207static void 208vmxnet3_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) 209{ 210 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 211 212 strlcpy(drvinfo->driver, vmxnet3_driver_name, sizeof(drvinfo->driver)); 213 214 strlcpy(drvinfo->version, VMXNET3_DRIVER_VERSION_REPORT, 215 sizeof(drvinfo->version)); 216 217 strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), 218 sizeof(drvinfo->bus_info)); 219} 220 221 222static void 223vmxnet3_get_strings(struct net_device *netdev, u32 stringset, u8 *buf) 224{ 225 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 226 int i, j; 227 228 if (stringset != ETH_SS_STATS) 229 return; 230 231 for (j = 0; j < adapter->num_tx_queues; j++) { 232 for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_dev_stats); i++) 233 ethtool_sprintf(&buf, vmxnet3_tq_dev_stats[i].desc); 234 for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_driver_stats); i++) 235 ethtool_sprintf(&buf, vmxnet3_tq_driver_stats[i].desc); 236 } 237 238 for (j = 0; j < adapter->num_rx_queues; j++) { 239 for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_dev_stats); i++) 240 ethtool_sprintf(&buf, vmxnet3_rq_dev_stats[i].desc); 241 for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_driver_stats); i++) 242 ethtool_sprintf(&buf, vmxnet3_rq_driver_stats[i].desc); 243 } 244 245 for (i = 0; i < ARRAY_SIZE(vmxnet3_global_stats); i++) 246 ethtool_sprintf(&buf, vmxnet3_global_stats[i].desc); 247} 248 249netdev_features_t vmxnet3_fix_features(struct net_device *netdev, 250 netdev_features_t features) 251{ 252 /* If Rx checksum is disabled, then LRO should also be disabled */ 253 if (!(features & NETIF_F_RXCSUM)) 254 features &= ~NETIF_F_LRO; 255 256 return features; 257} 258 259netdev_features_t vmxnet3_features_check(struct sk_buff *skb, 260 struct net_device *netdev, 261 netdev_features_t features) 262{ 263 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 264 265 /* Validate if the tunneled packet is being offloaded by the device */ 266 if (VMXNET3_VERSION_GE_4(adapter) && 267 skb->encapsulation && skb->ip_summed == CHECKSUM_PARTIAL) { 268 u8 l4_proto = 0; 269 u16 port; 270 struct udphdr *udph; 271 272 switch (vlan_get_protocol(skb)) { 273 case htons(ETH_P_IP): 274 l4_proto = ip_hdr(skb)->protocol; 275 break; 276 case htons(ETH_P_IPV6): 277 l4_proto = ipv6_hdr(skb)->nexthdr; 278 break; 279 default: 280 return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK); 281 } 282 283 switch (l4_proto) { 284 case IPPROTO_UDP: 285 udph = udp_hdr(skb); 286 port = be16_to_cpu(udph->dest); 287 /* Check if offloaded port is supported */ 288 if (port != GENEVE_UDP_PORT && 289 port != IANA_VXLAN_UDP_PORT && 290 port != VXLAN_UDP_PORT) { 291 return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK); 292 } 293 break; 294 default: 295 return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK); 296 } 297 } 298 return features; 299} 300 301static void vmxnet3_enable_encap_offloads(struct net_device *netdev) 302{ 303 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 304 305 if (VMXNET3_VERSION_GE_4(adapter)) { 306 netdev->hw_enc_features |= NETIF_F_SG | NETIF_F_RXCSUM | 307 NETIF_F_HW_CSUM | NETIF_F_HW_VLAN_CTAG_TX | 308 NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_TSO | NETIF_F_TSO6 | 309 NETIF_F_LRO | NETIF_F_GSO_UDP_TUNNEL | 310 NETIF_F_GSO_UDP_TUNNEL_CSUM; 311 } 312} 313 314static void vmxnet3_disable_encap_offloads(struct net_device *netdev) 315{ 316 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 317 318 if (VMXNET3_VERSION_GE_4(adapter)) { 319 netdev->hw_enc_features &= ~(NETIF_F_SG | NETIF_F_RXCSUM | 320 NETIF_F_HW_CSUM | NETIF_F_HW_VLAN_CTAG_TX | 321 NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_TSO | NETIF_F_TSO6 | 322 NETIF_F_LRO | NETIF_F_GSO_UDP_TUNNEL | 323 NETIF_F_GSO_UDP_TUNNEL_CSUM); 324 } 325} 326 327int vmxnet3_set_features(struct net_device *netdev, netdev_features_t features) 328{ 329 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 330 unsigned long flags; 331 netdev_features_t changed = features ^ netdev->features; 332 netdev_features_t tun_offload_mask = NETIF_F_GSO_UDP_TUNNEL | 333 NETIF_F_GSO_UDP_TUNNEL_CSUM; 334 u8 udp_tun_enabled = (netdev->features & tun_offload_mask) != 0; 335 336 if (changed & (NETIF_F_RXCSUM | NETIF_F_LRO | 337 NETIF_F_HW_VLAN_CTAG_RX | tun_offload_mask)) { 338 if (features & NETIF_F_RXCSUM) 339 adapter->shared->devRead.misc.uptFeatures |= 340 UPT1_F_RXCSUM; 341 else 342 adapter->shared->devRead.misc.uptFeatures &= 343 ~UPT1_F_RXCSUM; 344 345 /* update hardware LRO capability accordingly */ 346 if (features & NETIF_F_LRO) 347 adapter->shared->devRead.misc.uptFeatures |= 348 UPT1_F_LRO; 349 else 350 adapter->shared->devRead.misc.uptFeatures &= 351 ~UPT1_F_LRO; 352 353 if (features & NETIF_F_HW_VLAN_CTAG_RX) 354 adapter->shared->devRead.misc.uptFeatures |= 355 UPT1_F_RXVLAN; 356 else 357 adapter->shared->devRead.misc.uptFeatures &= 358 ~UPT1_F_RXVLAN; 359 360 if ((features & tun_offload_mask) != 0 && !udp_tun_enabled) { 361 vmxnet3_enable_encap_offloads(netdev); 362 adapter->shared->devRead.misc.uptFeatures |= 363 UPT1_F_RXINNEROFLD; 364 } else if ((features & tun_offload_mask) == 0 && 365 udp_tun_enabled) { 366 vmxnet3_disable_encap_offloads(netdev); 367 adapter->shared->devRead.misc.uptFeatures &= 368 ~UPT1_F_RXINNEROFLD; 369 } 370 371 spin_lock_irqsave(&adapter->cmd_lock, flags); 372 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 373 VMXNET3_CMD_UPDATE_FEATURE); 374 spin_unlock_irqrestore(&adapter->cmd_lock, flags); 375 } 376 return 0; 377} 378 379static void 380vmxnet3_get_ethtool_stats(struct net_device *netdev, 381 struct ethtool_stats *stats, u64 *buf) 382{ 383 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 384 unsigned long flags; 385 u8 *base; 386 int i; 387 int j = 0; 388 389 spin_lock_irqsave(&adapter->cmd_lock, flags); 390 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS); 391 spin_unlock_irqrestore(&adapter->cmd_lock, flags); 392 393 /* this does assume each counter is 64-bit wide */ 394 for (j = 0; j < adapter->num_tx_queues; j++) { 395 base = (u8 *)&adapter->tqd_start[j].stats; 396 *buf++ = (u64)j; 397 for (i = 1; i < ARRAY_SIZE(vmxnet3_tq_dev_stats); i++) 398 *buf++ = *(u64 *)(base + 399 vmxnet3_tq_dev_stats[i].offset); 400 401 base = (u8 *)&adapter->tx_queue[j].stats; 402 for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_driver_stats); i++) 403 *buf++ = *(u64 *)(base + 404 vmxnet3_tq_driver_stats[i].offset); 405 } 406 407 for (j = 0; j < adapter->num_rx_queues; j++) { 408 base = (u8 *)&adapter->rqd_start[j].stats; 409 *buf++ = (u64) j; 410 for (i = 1; i < ARRAY_SIZE(vmxnet3_rq_dev_stats); i++) 411 *buf++ = *(u64 *)(base + 412 vmxnet3_rq_dev_stats[i].offset); 413 414 base = (u8 *)&adapter->rx_queue[j].stats; 415 for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_driver_stats); i++) 416 *buf++ = *(u64 *)(base + 417 vmxnet3_rq_driver_stats[i].offset); 418 } 419 420 base = (u8 *)adapter; 421 for (i = 0; i < ARRAY_SIZE(vmxnet3_global_stats); i++) 422 *buf++ = *(u64 *)(base + vmxnet3_global_stats[i].offset); 423} 424 425 426/* This is a version 2 of the vmxnet3 ethtool_regs which goes hand in hand with 427 * the version 2 of the vmxnet3 support for ethtool(8) --register-dump. 428 * Therefore, if any registers are added, removed or modified, then a version 429 * bump and a corresponding change in the vmxnet3 support for ethtool(8) 430 * --register-dump would be required. 431 */ 432static void 433vmxnet3_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *p) 434{ 435 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 436 u32 *buf = p; 437 int i = 0, j = 0; 438 439 memset(p, 0, vmxnet3_get_regs_len(netdev)); 440 441 regs->version = 2; 442 443 /* Update vmxnet3_get_regs_len if we want to dump more registers */ 444 445 buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_VRRS); 446 buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_UVRS); 447 buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_DSAL); 448 buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_DSAH); 449 buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD); 450 buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_MACL); 451 buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_MACH); 452 buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_ICR); 453 buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_ECR); 454 455 buf[j++] = adapter->intr.num_intrs; 456 for (i = 0; i < adapter->intr.num_intrs; i++) { 457 buf[j++] = VMXNET3_READ_BAR0_REG(adapter, VMXNET3_REG_IMR 458 + i * VMXNET3_REG_ALIGN); 459 } 460 461 buf[j++] = adapter->num_tx_queues; 462 for (i = 0; i < adapter->num_tx_queues; i++) { 463 struct vmxnet3_tx_queue *tq = &adapter->tx_queue[i]; 464 465 buf[j++] = VMXNET3_READ_BAR0_REG(adapter, VMXNET3_REG_TXPROD + 466 i * VMXNET3_REG_ALIGN); 467 468 buf[j++] = VMXNET3_GET_ADDR_LO(tq->tx_ring.basePA); 469 buf[j++] = VMXNET3_GET_ADDR_HI(tq->tx_ring.basePA); 470 buf[j++] = tq->tx_ring.size; 471 buf[j++] = tq->tx_ring.next2fill; 472 buf[j++] = tq->tx_ring.next2comp; 473 buf[j++] = tq->tx_ring.gen; 474 475 buf[j++] = VMXNET3_GET_ADDR_LO(tq->data_ring.basePA); 476 buf[j++] = VMXNET3_GET_ADDR_HI(tq->data_ring.basePA); 477 buf[j++] = tq->data_ring.size; 478 buf[j++] = tq->txdata_desc_size; 479 480 buf[j++] = VMXNET3_GET_ADDR_LO(tq->comp_ring.basePA); 481 buf[j++] = VMXNET3_GET_ADDR_HI(tq->comp_ring.basePA); 482 buf[j++] = tq->comp_ring.size; 483 buf[j++] = tq->comp_ring.next2proc; 484 buf[j++] = tq->comp_ring.gen; 485 486 buf[j++] = tq->stopped; 487 } 488 489 buf[j++] = adapter->num_rx_queues; 490 for (i = 0; i < adapter->num_rx_queues; i++) { 491 struct vmxnet3_rx_queue *rq = &adapter->rx_queue[i]; 492 493 buf[j++] = VMXNET3_READ_BAR0_REG(adapter, VMXNET3_REG_RXPROD + 494 i * VMXNET3_REG_ALIGN); 495 buf[j++] = VMXNET3_READ_BAR0_REG(adapter, VMXNET3_REG_RXPROD2 + 496 i * VMXNET3_REG_ALIGN); 497 498 buf[j++] = VMXNET3_GET_ADDR_LO(rq->rx_ring[0].basePA); 499 buf[j++] = VMXNET3_GET_ADDR_HI(rq->rx_ring[0].basePA); 500 buf[j++] = rq->rx_ring[0].size; 501 buf[j++] = rq->rx_ring[0].next2fill; 502 buf[j++] = rq->rx_ring[0].next2comp; 503 buf[j++] = rq->rx_ring[0].gen; 504 505 buf[j++] = VMXNET3_GET_ADDR_LO(rq->rx_ring[1].basePA); 506 buf[j++] = VMXNET3_GET_ADDR_HI(rq->rx_ring[1].basePA); 507 buf[j++] = rq->rx_ring[1].size; 508 buf[j++] = rq->rx_ring[1].next2fill; 509 buf[j++] = rq->rx_ring[1].next2comp; 510 buf[j++] = rq->rx_ring[1].gen; 511 512 buf[j++] = VMXNET3_GET_ADDR_LO(rq->data_ring.basePA); 513 buf[j++] = VMXNET3_GET_ADDR_HI(rq->data_ring.basePA); 514 buf[j++] = rq->rx_ring[0].size; 515 buf[j++] = rq->data_ring.desc_size; 516 517 buf[j++] = VMXNET3_GET_ADDR_LO(rq->comp_ring.basePA); 518 buf[j++] = VMXNET3_GET_ADDR_HI(rq->comp_ring.basePA); 519 buf[j++] = rq->comp_ring.size; 520 buf[j++] = rq->comp_ring.next2proc; 521 buf[j++] = rq->comp_ring.gen; 522 } 523} 524 525 526static void 527vmxnet3_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) 528{ 529 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 530 531 wol->supported = WAKE_UCAST | WAKE_ARP | WAKE_MAGIC; 532 wol->wolopts = adapter->wol; 533} 534 535 536static int 537vmxnet3_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) 538{ 539 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 540 541 if (wol->wolopts & (WAKE_PHY | WAKE_MCAST | WAKE_BCAST | 542 WAKE_MAGICSECURE)) { 543 return -EOPNOTSUPP; 544 } 545 546 adapter->wol = wol->wolopts; 547 548 device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); 549 550 return 0; 551} 552 553 554static int 555vmxnet3_get_link_ksettings(struct net_device *netdev, 556 struct ethtool_link_ksettings *ecmd) 557{ 558 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 559 560 ethtool_link_ksettings_zero_link_mode(ecmd, supported); 561 ethtool_link_ksettings_add_link_mode(ecmd, supported, 10000baseT_Full); 562 ethtool_link_ksettings_add_link_mode(ecmd, supported, 1000baseT_Full); 563 ethtool_link_ksettings_add_link_mode(ecmd, supported, TP); 564 ethtool_link_ksettings_zero_link_mode(ecmd, advertising); 565 ethtool_link_ksettings_add_link_mode(ecmd, advertising, TP); 566 ecmd->base.port = PORT_TP; 567 568 if (adapter->link_speed) { 569 ecmd->base.speed = adapter->link_speed; 570 ecmd->base.duplex = DUPLEX_FULL; 571 } else { 572 ecmd->base.speed = SPEED_UNKNOWN; 573 ecmd->base.duplex = DUPLEX_UNKNOWN; 574 } 575 return 0; 576} 577 578static void 579vmxnet3_get_ringparam(struct net_device *netdev, 580 struct ethtool_ringparam *param, 581 struct kernel_ethtool_ringparam *kernel_param, 582 struct netlink_ext_ack *extack) 583{ 584 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 585 586 param->rx_max_pending = VMXNET3_RX_RING_MAX_SIZE; 587 param->tx_max_pending = VMXNET3_TX_RING_MAX_SIZE; 588 param->rx_mini_max_pending = VMXNET3_VERSION_GE_3(adapter) ? 589 VMXNET3_RXDATA_DESC_MAX_SIZE : 0; 590 param->rx_jumbo_max_pending = VMXNET3_RX_RING2_MAX_SIZE; 591 592 param->rx_pending = adapter->rx_ring_size; 593 param->tx_pending = adapter->tx_ring_size; 594 param->rx_mini_pending = VMXNET3_VERSION_GE_3(adapter) ? 595 adapter->rxdata_desc_size : 0; 596 param->rx_jumbo_pending = adapter->rx_ring2_size; 597} 598 599static int 600vmxnet3_set_ringparam(struct net_device *netdev, 601 struct ethtool_ringparam *param, 602 struct kernel_ethtool_ringparam *kernel_param, 603 struct netlink_ext_ack *extack) 604{ 605 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 606 u32 new_tx_ring_size, new_rx_ring_size, new_rx_ring2_size; 607 u16 new_rxdata_desc_size; 608 u32 sz; 609 int err = 0; 610 611 if (param->tx_pending == 0 || param->tx_pending > 612 VMXNET3_TX_RING_MAX_SIZE) 613 return -EINVAL; 614 615 if (param->rx_pending == 0 || param->rx_pending > 616 VMXNET3_RX_RING_MAX_SIZE) 617 return -EINVAL; 618 619 if (param->rx_jumbo_pending == 0 || 620 param->rx_jumbo_pending > VMXNET3_RX_RING2_MAX_SIZE) 621 return -EINVAL; 622 623 /* if adapter not yet initialized, do nothing */ 624 if (adapter->rx_buf_per_pkt == 0) { 625 netdev_err(netdev, "adapter not completely initialized, " 626 "ring size cannot be changed yet\n"); 627 return -EOPNOTSUPP; 628 } 629 630 if (VMXNET3_VERSION_GE_3(adapter)) { 631 if (param->rx_mini_pending > VMXNET3_RXDATA_DESC_MAX_SIZE) 632 return -EINVAL; 633 } else if (param->rx_mini_pending != 0) { 634 return -EINVAL; 635 } 636 637 /* round it up to a multiple of VMXNET3_RING_SIZE_ALIGN */ 638 new_tx_ring_size = (param->tx_pending + VMXNET3_RING_SIZE_MASK) & 639 ~VMXNET3_RING_SIZE_MASK; 640 new_tx_ring_size = min_t(u32, new_tx_ring_size, 641 VMXNET3_TX_RING_MAX_SIZE); 642 if (new_tx_ring_size > VMXNET3_TX_RING_MAX_SIZE || (new_tx_ring_size % 643 VMXNET3_RING_SIZE_ALIGN) != 0) 644 return -EINVAL; 645 646 /* ring0 has to be a multiple of 647 * rx_buf_per_pkt * VMXNET3_RING_SIZE_ALIGN 648 */ 649 sz = adapter->rx_buf_per_pkt * VMXNET3_RING_SIZE_ALIGN; 650 new_rx_ring_size = (param->rx_pending + sz - 1) / sz * sz; 651 new_rx_ring_size = min_t(u32, new_rx_ring_size, 652 VMXNET3_RX_RING_MAX_SIZE / sz * sz); 653 if (new_rx_ring_size > VMXNET3_RX_RING_MAX_SIZE || (new_rx_ring_size % 654 sz) != 0) 655 return -EINVAL; 656 657 /* ring2 has to be a multiple of VMXNET3_RING_SIZE_ALIGN */ 658 new_rx_ring2_size = (param->rx_jumbo_pending + VMXNET3_RING_SIZE_MASK) & 659 ~VMXNET3_RING_SIZE_MASK; 660 new_rx_ring2_size = min_t(u32, new_rx_ring2_size, 661 VMXNET3_RX_RING2_MAX_SIZE); 662 663 /* rx data ring buffer size has to be a multiple of 664 * VMXNET3_RXDATA_DESC_SIZE_ALIGN 665 */ 666 new_rxdata_desc_size = 667 (param->rx_mini_pending + VMXNET3_RXDATA_DESC_SIZE_MASK) & 668 ~VMXNET3_RXDATA_DESC_SIZE_MASK; 669 new_rxdata_desc_size = min_t(u16, new_rxdata_desc_size, 670 VMXNET3_RXDATA_DESC_MAX_SIZE); 671 672 if (new_tx_ring_size == adapter->tx_ring_size && 673 new_rx_ring_size == adapter->rx_ring_size && 674 new_rx_ring2_size == adapter->rx_ring2_size && 675 new_rxdata_desc_size == adapter->rxdata_desc_size) { 676 return 0; 677 } 678 679 /* 680 * Reset_work may be in the middle of resetting the device, wait for its 681 * completion. 682 */ 683 while (test_and_set_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state)) 684 usleep_range(1000, 2000); 685 686 if (netif_running(netdev)) { 687 vmxnet3_quiesce_dev(adapter); 688 vmxnet3_reset_dev(adapter); 689 690 /* recreate the rx queue and the tx queue based on the 691 * new sizes */ 692 vmxnet3_tq_destroy_all(adapter); 693 vmxnet3_rq_destroy_all(adapter); 694 695 err = vmxnet3_create_queues(adapter, new_tx_ring_size, 696 new_rx_ring_size, new_rx_ring2_size, 697 adapter->txdata_desc_size, 698 new_rxdata_desc_size); 699 if (err) { 700 /* failed, most likely because of OOM, try default 701 * size */ 702 netdev_err(netdev, "failed to apply new sizes, " 703 "try the default ones\n"); 704 new_rx_ring_size = VMXNET3_DEF_RX_RING_SIZE; 705 new_rx_ring2_size = VMXNET3_DEF_RX_RING2_SIZE; 706 new_tx_ring_size = VMXNET3_DEF_TX_RING_SIZE; 707 new_rxdata_desc_size = VMXNET3_VERSION_GE_3(adapter) ? 708 VMXNET3_DEF_RXDATA_DESC_SIZE : 0; 709 710 err = vmxnet3_create_queues(adapter, 711 new_tx_ring_size, 712 new_rx_ring_size, 713 new_rx_ring2_size, 714 adapter->txdata_desc_size, 715 new_rxdata_desc_size); 716 if (err) { 717 netdev_err(netdev, "failed to create queues " 718 "with default sizes. Closing it\n"); 719 goto out; 720 } 721 } 722 723 err = vmxnet3_activate_dev(adapter); 724 if (err) 725 netdev_err(netdev, "failed to re-activate, error %d." 726 " Closing it\n", err); 727 } 728 adapter->tx_ring_size = new_tx_ring_size; 729 adapter->rx_ring_size = new_rx_ring_size; 730 adapter->rx_ring2_size = new_rx_ring2_size; 731 adapter->rxdata_desc_size = new_rxdata_desc_size; 732 733out: 734 clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state); 735 if (err) 736 vmxnet3_force_close(adapter); 737 738 return err; 739} 740 741static int 742vmxnet3_get_rss_hash_opts(struct vmxnet3_adapter *adapter, 743 struct ethtool_rxnfc *info) 744{ 745 enum Vmxnet3_RSSField rss_fields; 746 747 if (netif_running(adapter->netdev)) { 748 unsigned long flags; 749 750 spin_lock_irqsave(&adapter->cmd_lock, flags); 751 752 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 753 VMXNET3_CMD_GET_RSS_FIELDS); 754 rss_fields = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD); 755 spin_unlock_irqrestore(&adapter->cmd_lock, flags); 756 } else { 757 rss_fields = adapter->rss_fields; 758 } 759 760 info->data = 0; 761 762 /* Report default options for RSS on vmxnet3 */ 763 switch (info->flow_type) { 764 case TCP_V4_FLOW: 765 case TCP_V6_FLOW: 766 info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3 | 767 RXH_IP_SRC | RXH_IP_DST; 768 break; 769 case UDP_V4_FLOW: 770 if (rss_fields & VMXNET3_RSS_FIELDS_UDPIP4) 771 info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; 772 info->data |= RXH_IP_SRC | RXH_IP_DST; 773 break; 774 case AH_ESP_V4_FLOW: 775 case AH_V4_FLOW: 776 case ESP_V4_FLOW: 777 if (rss_fields & VMXNET3_RSS_FIELDS_ESPIP4) 778 info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; 779 fallthrough; 780 case SCTP_V4_FLOW: 781 case IPV4_FLOW: 782 info->data |= RXH_IP_SRC | RXH_IP_DST; 783 break; 784 case UDP_V6_FLOW: 785 if (rss_fields & VMXNET3_RSS_FIELDS_UDPIP6) 786 info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; 787 info->data |= RXH_IP_SRC | RXH_IP_DST; 788 break; 789 case AH_ESP_V6_FLOW: 790 case AH_V6_FLOW: 791 case ESP_V6_FLOW: 792 if (VMXNET3_VERSION_GE_6(adapter) && 793 (rss_fields & VMXNET3_RSS_FIELDS_ESPIP6)) 794 info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; 795 fallthrough; 796 case SCTP_V6_FLOW: 797 case IPV6_FLOW: 798 info->data |= RXH_IP_SRC | RXH_IP_DST; 799 break; 800 default: 801 return -EINVAL; 802 } 803 804 return 0; 805} 806 807static int 808vmxnet3_set_rss_hash_opt(struct net_device *netdev, 809 struct vmxnet3_adapter *adapter, 810 struct ethtool_rxnfc *nfc) 811{ 812 enum Vmxnet3_RSSField rss_fields = adapter->rss_fields; 813 814 /* RSS does not support anything other than hashing 815 * to queues on src and dst IPs and ports 816 */ 817 if (nfc->data & ~(RXH_IP_SRC | RXH_IP_DST | 818 RXH_L4_B_0_1 | RXH_L4_B_2_3)) 819 return -EINVAL; 820 821 switch (nfc->flow_type) { 822 case TCP_V4_FLOW: 823 case TCP_V6_FLOW: 824 if (!(nfc->data & RXH_IP_SRC) || 825 !(nfc->data & RXH_IP_DST) || 826 !(nfc->data & RXH_L4_B_0_1) || 827 !(nfc->data & RXH_L4_B_2_3)) 828 return -EINVAL; 829 break; 830 case UDP_V4_FLOW: 831 if (!(nfc->data & RXH_IP_SRC) || 832 !(nfc->data & RXH_IP_DST)) 833 return -EINVAL; 834 switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) { 835 case 0: 836 rss_fields &= ~VMXNET3_RSS_FIELDS_UDPIP4; 837 break; 838 case (RXH_L4_B_0_1 | RXH_L4_B_2_3): 839 rss_fields |= VMXNET3_RSS_FIELDS_UDPIP4; 840 break; 841 default: 842 return -EINVAL; 843 } 844 break; 845 case UDP_V6_FLOW: 846 if (!(nfc->data & RXH_IP_SRC) || 847 !(nfc->data & RXH_IP_DST)) 848 return -EINVAL; 849 switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) { 850 case 0: 851 rss_fields &= ~VMXNET3_RSS_FIELDS_UDPIP6; 852 break; 853 case (RXH_L4_B_0_1 | RXH_L4_B_2_3): 854 rss_fields |= VMXNET3_RSS_FIELDS_UDPIP6; 855 break; 856 default: 857 return -EINVAL; 858 } 859 break; 860 case ESP_V4_FLOW: 861 case AH_V4_FLOW: 862 case AH_ESP_V4_FLOW: 863 if (!(nfc->data & RXH_IP_SRC) || 864 !(nfc->data & RXH_IP_DST)) 865 return -EINVAL; 866 switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) { 867 case 0: 868 rss_fields &= ~VMXNET3_RSS_FIELDS_ESPIP4; 869 break; 870 case (RXH_L4_B_0_1 | RXH_L4_B_2_3): 871 rss_fields |= VMXNET3_RSS_FIELDS_ESPIP4; 872 break; 873 default: 874 return -EINVAL; 875 } 876 break; 877 case ESP_V6_FLOW: 878 case AH_V6_FLOW: 879 case AH_ESP_V6_FLOW: 880 if (!VMXNET3_VERSION_GE_6(adapter)) 881 return -EOPNOTSUPP; 882 if (!(nfc->data & RXH_IP_SRC) || 883 !(nfc->data & RXH_IP_DST)) 884 return -EINVAL; 885 switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) { 886 case 0: 887 rss_fields &= ~VMXNET3_RSS_FIELDS_ESPIP6; 888 break; 889 case (RXH_L4_B_0_1 | RXH_L4_B_2_3): 890 rss_fields |= VMXNET3_RSS_FIELDS_ESPIP6; 891 break; 892 default: 893 return -EINVAL; 894 } 895 break; 896 case SCTP_V4_FLOW: 897 case SCTP_V6_FLOW: 898 if (!(nfc->data & RXH_IP_SRC) || 899 !(nfc->data & RXH_IP_DST) || 900 (nfc->data & RXH_L4_B_0_1) || 901 (nfc->data & RXH_L4_B_2_3)) 902 return -EINVAL; 903 break; 904 default: 905 return -EINVAL; 906 } 907 908 /* if we changed something we need to update flags */ 909 if (rss_fields != adapter->rss_fields) { 910 adapter->default_rss_fields = false; 911 if (netif_running(netdev)) { 912 struct Vmxnet3_DriverShared *shared = adapter->shared; 913 union Vmxnet3_CmdInfo *cmdInfo = &shared->cu.cmdInfo; 914 unsigned long flags; 915 916 spin_lock_irqsave(&adapter->cmd_lock, flags); 917 cmdInfo->setRssFields = rss_fields; 918 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 919 VMXNET3_CMD_SET_RSS_FIELDS); 920 921 /* Not all requested RSS may get applied, so get and 922 * cache what was actually applied. 923 */ 924 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 925 VMXNET3_CMD_GET_RSS_FIELDS); 926 adapter->rss_fields = 927 VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD); 928 spin_unlock_irqrestore(&adapter->cmd_lock, flags); 929 } else { 930 /* When the device is activated, we will try to apply 931 * these rules and cache the applied value later. 932 */ 933 adapter->rss_fields = rss_fields; 934 } 935 } 936 return 0; 937} 938 939static int 940vmxnet3_get_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *info, 941 u32 *rules) 942{ 943 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 944 int err = 0; 945 946 switch (info->cmd) { 947 case ETHTOOL_GRXRINGS: 948 info->data = adapter->num_rx_queues; 949 break; 950 case ETHTOOL_GRXFH: 951 if (!VMXNET3_VERSION_GE_4(adapter)) { 952 err = -EOPNOTSUPP; 953 break; 954 } 955#ifdef VMXNET3_RSS 956 if (!adapter->rss) { 957 err = -EOPNOTSUPP; 958 break; 959 } 960#endif 961 err = vmxnet3_get_rss_hash_opts(adapter, info); 962 break; 963 default: 964 err = -EOPNOTSUPP; 965 break; 966 } 967 968 return err; 969} 970 971static int 972vmxnet3_set_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *info) 973{ 974 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 975 int err = 0; 976 977 if (!VMXNET3_VERSION_GE_4(adapter)) { 978 err = -EOPNOTSUPP; 979 goto done; 980 } 981#ifdef VMXNET3_RSS 982 if (!adapter->rss) { 983 err = -EOPNOTSUPP; 984 goto done; 985 } 986#endif 987 988 switch (info->cmd) { 989 case ETHTOOL_SRXFH: 990 err = vmxnet3_set_rss_hash_opt(netdev, adapter, info); 991 break; 992 default: 993 err = -EOPNOTSUPP; 994 break; 995 } 996 997done: 998 return err; 999} 1000 1001#ifdef VMXNET3_RSS 1002static u32 1003vmxnet3_get_rss_indir_size(struct net_device *netdev) 1004{ 1005 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 1006 struct UPT1_RSSConf *rssConf = adapter->rss_conf; 1007 1008 return rssConf->indTableSize; 1009} 1010 1011static int 1012vmxnet3_get_rss(struct net_device *netdev, u32 *p, u8 *key, u8 *hfunc) 1013{ 1014 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 1015 struct UPT1_RSSConf *rssConf = adapter->rss_conf; 1016 unsigned int n = rssConf->indTableSize; 1017 1018 if (hfunc) 1019 *hfunc = ETH_RSS_HASH_TOP; 1020 if (!p) 1021 return 0; 1022 if (n > UPT1_RSS_MAX_IND_TABLE_SIZE) 1023 return 0; 1024 while (n--) 1025 p[n] = rssConf->indTable[n]; 1026 return 0; 1027 1028} 1029 1030static int 1031vmxnet3_set_rss(struct net_device *netdev, const u32 *p, const u8 *key, 1032 const u8 hfunc) 1033{ 1034 unsigned int i; 1035 unsigned long flags; 1036 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 1037 struct UPT1_RSSConf *rssConf = adapter->rss_conf; 1038 1039 /* We do not allow change in unsupported parameters */ 1040 if (key || 1041 (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP)) 1042 return -EOPNOTSUPP; 1043 if (!p) 1044 return 0; 1045 for (i = 0; i < rssConf->indTableSize; i++) 1046 rssConf->indTable[i] = p[i]; 1047 1048 spin_lock_irqsave(&adapter->cmd_lock, flags); 1049 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 1050 VMXNET3_CMD_UPDATE_RSSIDT); 1051 spin_unlock_irqrestore(&adapter->cmd_lock, flags); 1052 1053 return 0; 1054 1055} 1056#endif 1057 1058static int vmxnet3_get_coalesce(struct net_device *netdev, 1059 struct ethtool_coalesce *ec, 1060 struct kernel_ethtool_coalesce *kernel_coal, 1061 struct netlink_ext_ack *extack) 1062{ 1063 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 1064 1065 if (!VMXNET3_VERSION_GE_3(adapter)) 1066 return -EOPNOTSUPP; 1067 1068 switch (adapter->coal_conf->coalMode) { 1069 case VMXNET3_COALESCE_DISABLED: 1070 /* struct ethtool_coalesce is already initialized to 0 */ 1071 break; 1072 case VMXNET3_COALESCE_ADAPT: 1073 ec->use_adaptive_rx_coalesce = true; 1074 break; 1075 case VMXNET3_COALESCE_STATIC: 1076 ec->tx_max_coalesced_frames = 1077 adapter->coal_conf->coalPara.coalStatic.tx_comp_depth; 1078 ec->rx_max_coalesced_frames = 1079 adapter->coal_conf->coalPara.coalStatic.rx_depth; 1080 break; 1081 case VMXNET3_COALESCE_RBC: { 1082 u32 rbc_rate; 1083 1084 rbc_rate = adapter->coal_conf->coalPara.coalRbc.rbc_rate; 1085 ec->rx_coalesce_usecs = VMXNET3_COAL_RBC_USECS(rbc_rate); 1086 } 1087 break; 1088 default: 1089 return -EOPNOTSUPP; 1090 } 1091 1092 return 0; 1093} 1094 1095static int vmxnet3_set_coalesce(struct net_device *netdev, 1096 struct ethtool_coalesce *ec, 1097 struct kernel_ethtool_coalesce *kernel_coal, 1098 struct netlink_ext_ack *extack) 1099{ 1100 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 1101 struct Vmxnet3_DriverShared *shared = adapter->shared; 1102 union Vmxnet3_CmdInfo *cmdInfo = &shared->cu.cmdInfo; 1103 unsigned long flags; 1104 1105 if (!VMXNET3_VERSION_GE_3(adapter)) 1106 return -EOPNOTSUPP; 1107 1108 if ((ec->rx_coalesce_usecs == 0) && 1109 (ec->use_adaptive_rx_coalesce == 0) && 1110 (ec->tx_max_coalesced_frames == 0) && 1111 (ec->rx_max_coalesced_frames == 0)) { 1112 memset(adapter->coal_conf, 0, sizeof(*adapter->coal_conf)); 1113 adapter->coal_conf->coalMode = VMXNET3_COALESCE_DISABLED; 1114 goto done; 1115 } 1116 1117 if (ec->rx_coalesce_usecs != 0) { 1118 u32 rbc_rate; 1119 1120 if ((ec->use_adaptive_rx_coalesce != 0) || 1121 (ec->tx_max_coalesced_frames != 0) || 1122 (ec->rx_max_coalesced_frames != 0)) { 1123 return -EINVAL; 1124 } 1125 1126 rbc_rate = VMXNET3_COAL_RBC_RATE(ec->rx_coalesce_usecs); 1127 if (rbc_rate < VMXNET3_COAL_RBC_MIN_RATE || 1128 rbc_rate > VMXNET3_COAL_RBC_MAX_RATE) { 1129 return -EINVAL; 1130 } 1131 1132 memset(adapter->coal_conf, 0, sizeof(*adapter->coal_conf)); 1133 adapter->coal_conf->coalMode = VMXNET3_COALESCE_RBC; 1134 adapter->coal_conf->coalPara.coalRbc.rbc_rate = rbc_rate; 1135 goto done; 1136 } 1137 1138 if (ec->use_adaptive_rx_coalesce != 0) { 1139 if (ec->tx_max_coalesced_frames != 0 || 1140 ec->rx_max_coalesced_frames != 0) { 1141 return -EINVAL; 1142 } 1143 memset(adapter->coal_conf, 0, sizeof(*adapter->coal_conf)); 1144 adapter->coal_conf->coalMode = VMXNET3_COALESCE_ADAPT; 1145 goto done; 1146 } 1147 1148 if ((ec->tx_max_coalesced_frames != 0) || 1149 (ec->rx_max_coalesced_frames != 0)) { 1150 if ((ec->tx_max_coalesced_frames > 1151 VMXNET3_COAL_STATIC_MAX_DEPTH) || 1152 (ec->rx_max_coalesced_frames > 1153 VMXNET3_COAL_STATIC_MAX_DEPTH)) { 1154 return -EINVAL; 1155 } 1156 1157 memset(adapter->coal_conf, 0, sizeof(*adapter->coal_conf)); 1158 adapter->coal_conf->coalMode = VMXNET3_COALESCE_STATIC; 1159 1160 adapter->coal_conf->coalPara.coalStatic.tx_comp_depth = 1161 (ec->tx_max_coalesced_frames ? 1162 ec->tx_max_coalesced_frames : 1163 VMXNET3_COAL_STATIC_DEFAULT_DEPTH); 1164 1165 adapter->coal_conf->coalPara.coalStatic.rx_depth = 1166 (ec->rx_max_coalesced_frames ? 1167 ec->rx_max_coalesced_frames : 1168 VMXNET3_COAL_STATIC_DEFAULT_DEPTH); 1169 1170 adapter->coal_conf->coalPara.coalStatic.tx_depth = 1171 VMXNET3_COAL_STATIC_DEFAULT_DEPTH; 1172 goto done; 1173 } 1174 1175done: 1176 adapter->default_coal_mode = false; 1177 if (netif_running(netdev)) { 1178 spin_lock_irqsave(&adapter->cmd_lock, flags); 1179 cmdInfo->varConf.confVer = 1; 1180 cmdInfo->varConf.confLen = 1181 cpu_to_le32(sizeof(*adapter->coal_conf)); 1182 cmdInfo->varConf.confPA = cpu_to_le64(adapter->coal_conf_pa); 1183 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 1184 VMXNET3_CMD_SET_COALESCE); 1185 spin_unlock_irqrestore(&adapter->cmd_lock, flags); 1186 } 1187 1188 return 0; 1189} 1190 1191static const struct ethtool_ops vmxnet3_ethtool_ops = { 1192 .supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS | 1193 ETHTOOL_COALESCE_MAX_FRAMES | 1194 ETHTOOL_COALESCE_USE_ADAPTIVE_RX, 1195 .get_drvinfo = vmxnet3_get_drvinfo, 1196 .get_regs_len = vmxnet3_get_regs_len, 1197 .get_regs = vmxnet3_get_regs, 1198 .get_wol = vmxnet3_get_wol, 1199 .set_wol = vmxnet3_set_wol, 1200 .get_link = ethtool_op_get_link, 1201 .get_coalesce = vmxnet3_get_coalesce, 1202 .set_coalesce = vmxnet3_set_coalesce, 1203 .get_strings = vmxnet3_get_strings, 1204 .get_sset_count = vmxnet3_get_sset_count, 1205 .get_ethtool_stats = vmxnet3_get_ethtool_stats, 1206 .get_ringparam = vmxnet3_get_ringparam, 1207 .set_ringparam = vmxnet3_set_ringparam, 1208 .get_rxnfc = vmxnet3_get_rxnfc, 1209 .set_rxnfc = vmxnet3_set_rxnfc, 1210#ifdef VMXNET3_RSS 1211 .get_rxfh_indir_size = vmxnet3_get_rss_indir_size, 1212 .get_rxfh = vmxnet3_get_rss, 1213 .set_rxfh = vmxnet3_set_rss, 1214#endif 1215 .get_link_ksettings = vmxnet3_get_link_ksettings, 1216}; 1217 1218void vmxnet3_set_ethtool_ops(struct net_device *netdev) 1219{ 1220 netdev->ethtool_ops = &vmxnet3_ethtool_ops; 1221}