diff options
author | Shrikrishna Khare <skhare@vmware.com> | 2015-01-06 12:20:15 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-01-06 14:15:16 -0500 |
commit | 53831aa12538f8753fb77b7ab6408cce54973b30 (patch) | |
tree | b30ab914a21372dcd713329297e036f35376b1c8 | |
parent | 7c8f1e78612f3155bfd10c020b38bcb4ca175223 (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.h | 1 | ||||
-rw-r--r-- | drivers/net/vmxnet3/vmxnet3_drv.c | 6 | ||||
-rw-r--r-- | drivers/net/vmxnet3/vmxnet3_ethtool.c | 27 | ||||
-rw-r--r-- | drivers/net/vmxnet3/vmxnet3_int.h | 6 |
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 | ||
553 | out: | 566 | out: |
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) |