aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShrikrishna Khare <skhare@vmware.com>2015-01-06 12:20:15 -0500
committerDavid S. Miller <davem@davemloft.net>2015-01-06 14:15:16 -0500
commit53831aa12538f8753fb77b7ab6408cce54973b30 (patch)
treeb30ab914a21372dcd713329297e036f35376b1c8
parent7c8f1e78612f3155bfd10c020b38bcb4ca175223 (diff)
Driver: Vmxnet3: Make Rx ring 2 size configurable
Rx ring 2 size can be configured by adjusting rx-jumbo parameter of ethtool -G. Signed-off-by: Ramya Bolla <bollar@vmware.com> Signed-off-by: Shreyas Bhatewara <sbhatewara@vmware.com> Signed-off-by: Shrikrishna Khare <skhare@vmware.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/vmxnet3/vmxnet3_defs.h1
-rw-r--r--drivers/net/vmxnet3/vmxnet3_drv.c6
-rw-r--r--drivers/net/vmxnet3/vmxnet3_ethtool.c27
-rw-r--r--drivers/net/vmxnet3/vmxnet3_int.h6
4 files changed, 30 insertions, 10 deletions
diff --git a/drivers/net/vmxnet3/vmxnet3_defs.h b/drivers/net/vmxnet3/vmxnet3_defs.h
index 4d84912c99ba..25b6fa4810b5 100644
--- a/drivers/net/vmxnet3/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/vmxnet3_defs.h
@@ -342,6 +342,7 @@ union Vmxnet3_GenericDesc {
342#define VMXNET3_TX_RING_MAX_SIZE 4096 342#define VMXNET3_TX_RING_MAX_SIZE 4096
343#define VMXNET3_TC_RING_MAX_SIZE 4096 343#define VMXNET3_TC_RING_MAX_SIZE 4096
344#define VMXNET3_RX_RING_MAX_SIZE 4096 344#define VMXNET3_RX_RING_MAX_SIZE 4096
345#define VMXNET3_RX_RING2_MAX_SIZE 2048
345#define VMXNET3_RC_RING_MAX_SIZE 8192 346#define VMXNET3_RC_RING_MAX_SIZE 8192
346 347
347/* a list of reasons for queue stop */ 348/* a list of reasons for queue stop */
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c
index afd295348ddb..7af1f5cfa87a 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -2505,6 +2505,9 @@ vmxnet3_adjust_rx_ring_size(struct vmxnet3_adapter *adapter)
2505 ring0_size = min_t(u32, ring0_size, VMXNET3_RX_RING_MAX_SIZE / 2505 ring0_size = min_t(u32, ring0_size, VMXNET3_RX_RING_MAX_SIZE /
2506 sz * sz); 2506 sz * sz);
2507 ring1_size = adapter->rx_queue[0].rx_ring[1].size; 2507 ring1_size = adapter->rx_queue[0].rx_ring[1].size;
2508 ring1_size = (ring1_size + sz - 1) / sz * sz;
2509 ring1_size = min_t(u32, ring1_size, VMXNET3_RX_RING2_MAX_SIZE /
2510 sz * sz);
2508 comp_size = ring0_size + ring1_size; 2511 comp_size = ring0_size + ring1_size;
2509 2512
2510 for (i = 0; i < adapter->num_rx_queues; i++) { 2513 for (i = 0; i < adapter->num_rx_queues; i++) {
@@ -2585,7 +2588,7 @@ vmxnet3_open(struct net_device *netdev)
2585 2588
2586 err = vmxnet3_create_queues(adapter, adapter->tx_ring_size, 2589 err = vmxnet3_create_queues(adapter, adapter->tx_ring_size,
2587 adapter->rx_ring_size, 2590 adapter->rx_ring_size,
2588 VMXNET3_DEF_RX_RING_SIZE); 2591 adapter->rx_ring2_size);
2589 if (err) 2592 if (err)
2590 goto queue_err; 2593 goto queue_err;
2591 2594
@@ -2964,6 +2967,7 @@ vmxnet3_probe_device(struct pci_dev *pdev,
2964 2967
2965 adapter->tx_ring_size = VMXNET3_DEF_TX_RING_SIZE; 2968 adapter->tx_ring_size = VMXNET3_DEF_TX_RING_SIZE;
2966 adapter->rx_ring_size = VMXNET3_DEF_RX_RING_SIZE; 2969 adapter->rx_ring_size = VMXNET3_DEF_RX_RING_SIZE;
2970 adapter->rx_ring2_size = VMXNET3_DEF_RX_RING2_SIZE;
2967 2971
2968 spin_lock_init(&adapter->cmd_lock); 2972 spin_lock_init(&adapter->cmd_lock);
2969 adapter->adapter_pa = dma_map_single(&adapter->pdev->dev, adapter, 2973 adapter->adapter_pa = dma_map_single(&adapter->pdev->dev, adapter,
diff --git a/drivers/net/vmxnet3/vmxnet3_ethtool.c b/drivers/net/vmxnet3/vmxnet3_ethtool.c
index b7b53329d575..8a5a90eeb4f9 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethtool.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethtool.c
@@ -447,12 +447,12 @@ vmxnet3_get_ringparam(struct net_device *netdev,
447 param->rx_max_pending = VMXNET3_RX_RING_MAX_SIZE; 447 param->rx_max_pending = VMXNET3_RX_RING_MAX_SIZE;
448 param->tx_max_pending = VMXNET3_TX_RING_MAX_SIZE; 448 param->tx_max_pending = VMXNET3_TX_RING_MAX_SIZE;
449 param->rx_mini_max_pending = 0; 449 param->rx_mini_max_pending = 0;
450 param->rx_jumbo_max_pending = 0; 450 param->rx_jumbo_max_pending = VMXNET3_RX_RING2_MAX_SIZE;
451 451
452 param->rx_pending = adapter->rx_ring_size; 452 param->rx_pending = adapter->rx_ring_size;
453 param->tx_pending = adapter->tx_ring_size; 453 param->tx_pending = adapter->tx_ring_size;
454 param->rx_mini_pending = 0; 454 param->rx_mini_pending = 0;
455 param->rx_jumbo_pending = 0; 455 param->rx_jumbo_pending = adapter->rx_ring2_size;
456} 456}
457 457
458 458
@@ -461,7 +461,7 @@ vmxnet3_set_ringparam(struct net_device *netdev,
461 struct ethtool_ringparam *param) 461 struct ethtool_ringparam *param)
462{ 462{
463 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 463 struct vmxnet3_adapter *adapter = netdev_priv(netdev);
464 u32 new_tx_ring_size, new_rx_ring_size; 464 u32 new_tx_ring_size, new_rx_ring_size, new_rx_ring2_size;
465 u32 sz; 465 u32 sz;
466 int err = 0; 466 int err = 0;
467 467
@@ -473,6 +473,10 @@ vmxnet3_set_ringparam(struct net_device *netdev,
473 VMXNET3_RX_RING_MAX_SIZE) 473 VMXNET3_RX_RING_MAX_SIZE)
474 return -EINVAL; 474 return -EINVAL;
475 475
476 if (param->rx_jumbo_pending == 0 ||
477 param->rx_jumbo_pending > VMXNET3_RX_RING2_MAX_SIZE)
478 return -EINVAL;
479
476 /* if adapter not yet initialized, do nothing */ 480 /* if adapter not yet initialized, do nothing */
477 if (adapter->rx_buf_per_pkt == 0) { 481 if (adapter->rx_buf_per_pkt == 0) {
478 netdev_err(netdev, "adapter not completely initialized, " 482 netdev_err(netdev, "adapter not completely initialized, "
@@ -500,8 +504,15 @@ vmxnet3_set_ringparam(struct net_device *netdev,
500 sz) != 0) 504 sz) != 0)
501 return -EINVAL; 505 return -EINVAL;
502 506
503 if (new_tx_ring_size == adapter->tx_queue[0].tx_ring.size && 507 /* ring2 has to be a multiple of VMXNET3_RING_SIZE_ALIGN */
504 new_rx_ring_size == adapter->rx_queue[0].rx_ring[0].size) { 508 new_rx_ring2_size = (param->rx_jumbo_pending + VMXNET3_RING_SIZE_MASK) &
509 ~VMXNET3_RING_SIZE_MASK;
510 new_rx_ring2_size = min_t(u32, new_rx_ring2_size,
511 VMXNET3_RX_RING2_MAX_SIZE);
512
513 if (new_tx_ring_size == adapter->tx_ring_size &&
514 new_rx_ring_size == adapter->rx_ring_size &&
515 new_rx_ring2_size == adapter->rx_ring2_size) {
505 return 0; 516 return 0;
506 } 517 }
507 518
@@ -522,7 +533,7 @@ vmxnet3_set_ringparam(struct net_device *netdev,
522 vmxnet3_rq_destroy_all(adapter); 533 vmxnet3_rq_destroy_all(adapter);
523 534
524 err = vmxnet3_create_queues(adapter, new_tx_ring_size, 535 err = vmxnet3_create_queues(adapter, new_tx_ring_size,
525 new_rx_ring_size, VMXNET3_DEF_RX_RING_SIZE); 536 new_rx_ring_size, new_rx_ring2_size);
526 537
527 if (err) { 538 if (err) {
528 /* failed, most likely because of OOM, try default 539 /* failed, most likely because of OOM, try default
@@ -530,11 +541,12 @@ vmxnet3_set_ringparam(struct net_device *netdev,
530 netdev_err(netdev, "failed to apply new sizes, " 541 netdev_err(netdev, "failed to apply new sizes, "
531 "try the default ones\n"); 542 "try the default ones\n");
532 new_rx_ring_size = VMXNET3_DEF_RX_RING_SIZE; 543 new_rx_ring_size = VMXNET3_DEF_RX_RING_SIZE;
544 new_rx_ring2_size = VMXNET3_DEF_RX_RING2_SIZE;
533 new_tx_ring_size = VMXNET3_DEF_TX_RING_SIZE; 545 new_tx_ring_size = VMXNET3_DEF_TX_RING_SIZE;
534 err = vmxnet3_create_queues(adapter, 546 err = vmxnet3_create_queues(adapter,
535 new_tx_ring_size, 547 new_tx_ring_size,
536 new_rx_ring_size, 548 new_rx_ring_size,
537 VMXNET3_DEF_RX_RING_SIZE); 549 new_rx_ring2_size);
538 if (err) { 550 if (err) {
539 netdev_err(netdev, "failed to create queues " 551 netdev_err(netdev, "failed to create queues "
540 "with default sizes. Closing it\n"); 552 "with default sizes. Closing it\n");
@@ -549,6 +561,7 @@ vmxnet3_set_ringparam(struct net_device *netdev,
549 } 561 }
550 adapter->tx_ring_size = new_tx_ring_size; 562 adapter->tx_ring_size = new_tx_ring_size;
551 adapter->rx_ring_size = new_rx_ring_size; 563 adapter->rx_ring_size = new_rx_ring_size;
564 adapter->rx_ring2_size = new_rx_ring2_size;
552 565
553out: 566out:
554 clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state); 567 clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state);
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h
index 5f0199f6c31e..048f02058ec9 100644
--- a/drivers/net/vmxnet3/vmxnet3_int.h
+++ b/drivers/net/vmxnet3/vmxnet3_int.h
@@ -69,10 +69,10 @@
69/* 69/*
70 * Version numbers 70 * Version numbers
71 */ 71 */
72#define VMXNET3_DRIVER_VERSION_STRING "1.2.1.0-k" 72#define VMXNET3_DRIVER_VERSION_STRING "1.3.1.0-k"
73 73
74/* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ 74/* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */
75#define VMXNET3_DRIVER_VERSION_NUM 0x01020100 75#define VMXNET3_DRIVER_VERSION_NUM 0x01030100
76 76
77#if defined(CONFIG_PCI_MSI) 77#if defined(CONFIG_PCI_MSI)
78 /* RSS only makes sense if MSI-X is supported. */ 78 /* RSS only makes sense if MSI-X is supported. */
@@ -352,6 +352,7 @@ struct vmxnet3_adapter {
352 /* Ring sizes */ 352 /* Ring sizes */
353 u32 tx_ring_size; 353 u32 tx_ring_size;
354 u32 rx_ring_size; 354 u32 rx_ring_size;
355 u32 rx_ring2_size;
355 356
356 struct work_struct work; 357 struct work_struct work;
357 358
@@ -384,6 +385,7 @@ struct vmxnet3_adapter {
384/* must be a multiple of VMXNET3_RING_SIZE_ALIGN */ 385/* must be a multiple of VMXNET3_RING_SIZE_ALIGN */
385#define VMXNET3_DEF_TX_RING_SIZE 512 386#define VMXNET3_DEF_TX_RING_SIZE 512
386#define VMXNET3_DEF_RX_RING_SIZE 256 387#define VMXNET3_DEF_RX_RING_SIZE 256
388#define VMXNET3_DEF_RX_RING2_SIZE 128
387 389
388#define VMXNET3_MAX_ETH_HDR_SIZE 22 390#define VMXNET3_MAX_ETH_HDR_SIZE 22
389#define VMXNET3_MAX_SKB_BUF_SIZE (3*1024) 391#define VMXNET3_MAX_SKB_BUF_SIZE (3*1024)