diff options
author | Himanshu Madhani <himanshu.madhani@qlogic.com> | 2013-11-04 13:31:31 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-11-04 15:33:19 -0500 |
commit | 34e8c406fda5b5a9d2e126a92bab84cd28e3b5fa (patch) | |
tree | 7867f7b76c97c693425d76e424ce54aa7e0dcbd2 /drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | |
parent | f27c75b3903ab02bfe295aa58ad61ef5b756b065 (diff) |
qlcnic: refactor Tx/SDS ring calculation and validation in driver.
o Current driver has duplicate code for validating user input
for changing Tx/SDS rings using set_channel ethtool interface.
This patch removes duplicate code and refactored Tx/SDS ring
validation for 82xx/83xx/84xx series adapter.
o Refactored code now calculates maximum Tx/Rx ring driver can
support based on Default, NPAR and SRIOV PF/VF mode of driver.
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c')
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c index df31be7a7aba..1c07ec250f23 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | |||
@@ -787,6 +787,9 @@ static int qlcnic_process_cmd_ring(struct qlcnic_adapter *adapter, | |||
787 | struct net_device *netdev = adapter->netdev; | 787 | struct net_device *netdev = adapter->netdev; |
788 | struct qlcnic_skb_frag *frag; | 788 | struct qlcnic_skb_frag *frag; |
789 | 789 | ||
790 | if (!spin_trylock(&adapter->tx_clean_lock)) | ||
791 | return 1; | ||
792 | |||
790 | sw_consumer = tx_ring->sw_consumer; | 793 | sw_consumer = tx_ring->sw_consumer; |
791 | hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer)); | 794 | hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer)); |
792 | 795 | ||
@@ -840,6 +843,7 @@ static int qlcnic_process_cmd_ring(struct qlcnic_adapter *adapter, | |||
840 | */ | 843 | */ |
841 | hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer)); | 844 | hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer)); |
842 | done = (sw_consumer == hw_consumer); | 845 | done = (sw_consumer == hw_consumer); |
846 | spin_unlock(&adapter->tx_clean_lock); | ||
843 | 847 | ||
844 | return done; | 848 | return done; |
845 | } | 849 | } |
@@ -1459,18 +1463,18 @@ int qlcnic_82xx_napi_add(struct qlcnic_adapter *adapter, | |||
1459 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; | 1463 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; |
1460 | struct qlcnic_host_tx_ring *tx_ring; | 1464 | struct qlcnic_host_tx_ring *tx_ring; |
1461 | 1465 | ||
1462 | if (qlcnic_alloc_sds_rings(recv_ctx, adapter->max_sds_rings)) | 1466 | if (qlcnic_alloc_sds_rings(recv_ctx, adapter->drv_sds_rings)) |
1463 | return -ENOMEM; | 1467 | return -ENOMEM; |
1464 | 1468 | ||
1465 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 1469 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { |
1466 | sds_ring = &recv_ctx->sds_rings[ring]; | 1470 | sds_ring = &recv_ctx->sds_rings[ring]; |
1467 | if (qlcnic_check_multi_tx(adapter) && | 1471 | if (qlcnic_check_multi_tx(adapter) && |
1468 | !adapter->ahw->diag_test && | 1472 | !adapter->ahw->diag_test && |
1469 | (adapter->max_drv_tx_rings > 1)) { | 1473 | (adapter->drv_tx_rings > QLCNIC_SINGLE_RING)) { |
1470 | netif_napi_add(netdev, &sds_ring->napi, qlcnic_rx_poll, | 1474 | netif_napi_add(netdev, &sds_ring->napi, qlcnic_rx_poll, |
1471 | NAPI_POLL_WEIGHT); | 1475 | NAPI_POLL_WEIGHT); |
1472 | } else { | 1476 | } else { |
1473 | if (ring == (adapter->max_sds_rings - 1)) | 1477 | if (ring == (adapter->drv_sds_rings - 1)) |
1474 | netif_napi_add(netdev, &sds_ring->napi, | 1478 | netif_napi_add(netdev, &sds_ring->napi, |
1475 | qlcnic_poll, | 1479 | qlcnic_poll, |
1476 | NAPI_POLL_WEIGHT); | 1480 | NAPI_POLL_WEIGHT); |
@@ -1487,7 +1491,7 @@ int qlcnic_82xx_napi_add(struct qlcnic_adapter *adapter, | |||
1487 | } | 1491 | } |
1488 | 1492 | ||
1489 | if (qlcnic_check_multi_tx(adapter) && !adapter->ahw->diag_test) { | 1493 | if (qlcnic_check_multi_tx(adapter) && !adapter->ahw->diag_test) { |
1490 | for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) { | 1494 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) { |
1491 | tx_ring = &adapter->tx_ring[ring]; | 1495 | tx_ring = &adapter->tx_ring[ring]; |
1492 | netif_napi_add(netdev, &tx_ring->napi, qlcnic_tx_poll, | 1496 | netif_napi_add(netdev, &tx_ring->napi, qlcnic_tx_poll, |
1493 | NAPI_POLL_WEIGHT); | 1497 | NAPI_POLL_WEIGHT); |
@@ -1504,7 +1508,7 @@ void qlcnic_82xx_napi_del(struct qlcnic_adapter *adapter) | |||
1504 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; | 1508 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; |
1505 | struct qlcnic_host_tx_ring *tx_ring; | 1509 | struct qlcnic_host_tx_ring *tx_ring; |
1506 | 1510 | ||
1507 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 1511 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { |
1508 | sds_ring = &recv_ctx->sds_rings[ring]; | 1512 | sds_ring = &recv_ctx->sds_rings[ring]; |
1509 | netif_napi_del(&sds_ring->napi); | 1513 | netif_napi_del(&sds_ring->napi); |
1510 | } | 1514 | } |
@@ -1512,7 +1516,7 @@ void qlcnic_82xx_napi_del(struct qlcnic_adapter *adapter) | |||
1512 | qlcnic_free_sds_rings(adapter->recv_ctx); | 1516 | qlcnic_free_sds_rings(adapter->recv_ctx); |
1513 | 1517 | ||
1514 | if (qlcnic_check_multi_tx(adapter) && !adapter->ahw->diag_test) { | 1518 | if (qlcnic_check_multi_tx(adapter) && !adapter->ahw->diag_test) { |
1515 | for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) { | 1519 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) { |
1516 | tx_ring = &adapter->tx_ring[ring]; | 1520 | tx_ring = &adapter->tx_ring[ring]; |
1517 | netif_napi_del(&tx_ring->napi); | 1521 | netif_napi_del(&tx_ring->napi); |
1518 | } | 1522 | } |
@@ -1531,7 +1535,7 @@ void qlcnic_82xx_napi_enable(struct qlcnic_adapter *adapter) | |||
1531 | if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) | 1535 | if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) |
1532 | return; | 1536 | return; |
1533 | 1537 | ||
1534 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 1538 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { |
1535 | sds_ring = &recv_ctx->sds_rings[ring]; | 1539 | sds_ring = &recv_ctx->sds_rings[ring]; |
1536 | napi_enable(&sds_ring->napi); | 1540 | napi_enable(&sds_ring->napi); |
1537 | qlcnic_enable_int(sds_ring); | 1541 | qlcnic_enable_int(sds_ring); |
@@ -1540,8 +1544,8 @@ void qlcnic_82xx_napi_enable(struct qlcnic_adapter *adapter) | |||
1540 | if (qlcnic_check_multi_tx(adapter) && | 1544 | if (qlcnic_check_multi_tx(adapter) && |
1541 | (adapter->flags & QLCNIC_MSIX_ENABLED) && | 1545 | (adapter->flags & QLCNIC_MSIX_ENABLED) && |
1542 | !adapter->ahw->diag_test && | 1546 | !adapter->ahw->diag_test && |
1543 | (adapter->max_drv_tx_rings > 1)) { | 1547 | (adapter->drv_tx_rings > QLCNIC_SINGLE_RING)) { |
1544 | for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) { | 1548 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) { |
1545 | tx_ring = &adapter->tx_ring[ring]; | 1549 | tx_ring = &adapter->tx_ring[ring]; |
1546 | napi_enable(&tx_ring->napi); | 1550 | napi_enable(&tx_ring->napi); |
1547 | qlcnic_enable_tx_intr(adapter, tx_ring); | 1551 | qlcnic_enable_tx_intr(adapter, tx_ring); |
@@ -1559,7 +1563,7 @@ void qlcnic_82xx_napi_disable(struct qlcnic_adapter *adapter) | |||
1559 | if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) | 1563 | if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) |
1560 | return; | 1564 | return; |
1561 | 1565 | ||
1562 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 1566 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { |
1563 | sds_ring = &recv_ctx->sds_rings[ring]; | 1567 | sds_ring = &recv_ctx->sds_rings[ring]; |
1564 | qlcnic_disable_int(sds_ring); | 1568 | qlcnic_disable_int(sds_ring); |
1565 | napi_synchronize(&sds_ring->napi); | 1569 | napi_synchronize(&sds_ring->napi); |
@@ -1569,7 +1573,7 @@ void qlcnic_82xx_napi_disable(struct qlcnic_adapter *adapter) | |||
1569 | if ((adapter->flags & QLCNIC_MSIX_ENABLED) && | 1573 | if ((adapter->flags & QLCNIC_MSIX_ENABLED) && |
1570 | !adapter->ahw->diag_test && | 1574 | !adapter->ahw->diag_test && |
1571 | qlcnic_check_multi_tx(adapter)) { | 1575 | qlcnic_check_multi_tx(adapter)) { |
1572 | for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) { | 1576 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) { |
1573 | tx_ring = &adapter->tx_ring[ring]; | 1577 | tx_ring = &adapter->tx_ring[ring]; |
1574 | qlcnic_disable_tx_int(adapter, tx_ring); | 1578 | qlcnic_disable_tx_int(adapter, tx_ring); |
1575 | napi_synchronize(&tx_ring->napi); | 1579 | napi_synchronize(&tx_ring->napi); |
@@ -1907,7 +1911,7 @@ void qlcnic_83xx_napi_enable(struct qlcnic_adapter *adapter) | |||
1907 | if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) | 1911 | if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) |
1908 | return; | 1912 | return; |
1909 | 1913 | ||
1910 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 1914 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { |
1911 | sds_ring = &recv_ctx->sds_rings[ring]; | 1915 | sds_ring = &recv_ctx->sds_rings[ring]; |
1912 | napi_enable(&sds_ring->napi); | 1916 | napi_enable(&sds_ring->napi); |
1913 | if (adapter->flags & QLCNIC_MSIX_ENABLED) | 1917 | if (adapter->flags & QLCNIC_MSIX_ENABLED) |
@@ -1916,7 +1920,7 @@ void qlcnic_83xx_napi_enable(struct qlcnic_adapter *adapter) | |||
1916 | 1920 | ||
1917 | if ((adapter->flags & QLCNIC_MSIX_ENABLED) && | 1921 | if ((adapter->flags & QLCNIC_MSIX_ENABLED) && |
1918 | !(adapter->flags & QLCNIC_TX_INTR_SHARED)) { | 1922 | !(adapter->flags & QLCNIC_TX_INTR_SHARED)) { |
1919 | for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) { | 1923 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) { |
1920 | tx_ring = &adapter->tx_ring[ring]; | 1924 | tx_ring = &adapter->tx_ring[ring]; |
1921 | napi_enable(&tx_ring->napi); | 1925 | napi_enable(&tx_ring->napi); |
1922 | qlcnic_83xx_enable_tx_intr(adapter, tx_ring); | 1926 | qlcnic_83xx_enable_tx_intr(adapter, tx_ring); |
@@ -1934,7 +1938,7 @@ void qlcnic_83xx_napi_disable(struct qlcnic_adapter *adapter) | |||
1934 | if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) | 1938 | if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) |
1935 | return; | 1939 | return; |
1936 | 1940 | ||
1937 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 1941 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { |
1938 | sds_ring = &recv_ctx->sds_rings[ring]; | 1942 | sds_ring = &recv_ctx->sds_rings[ring]; |
1939 | if (adapter->flags & QLCNIC_MSIX_ENABLED) | 1943 | if (adapter->flags & QLCNIC_MSIX_ENABLED) |
1940 | qlcnic_83xx_disable_intr(adapter, sds_ring); | 1944 | qlcnic_83xx_disable_intr(adapter, sds_ring); |
@@ -1944,7 +1948,7 @@ void qlcnic_83xx_napi_disable(struct qlcnic_adapter *adapter) | |||
1944 | 1948 | ||
1945 | if ((adapter->flags & QLCNIC_MSIX_ENABLED) && | 1949 | if ((adapter->flags & QLCNIC_MSIX_ENABLED) && |
1946 | !(adapter->flags & QLCNIC_TX_INTR_SHARED)) { | 1950 | !(adapter->flags & QLCNIC_TX_INTR_SHARED)) { |
1947 | for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) { | 1951 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) { |
1948 | tx_ring = &adapter->tx_ring[ring]; | 1952 | tx_ring = &adapter->tx_ring[ring]; |
1949 | qlcnic_83xx_disable_tx_intr(adapter, tx_ring); | 1953 | qlcnic_83xx_disable_tx_intr(adapter, tx_ring); |
1950 | napi_synchronize(&tx_ring->napi); | 1954 | napi_synchronize(&tx_ring->napi); |
@@ -1961,10 +1965,10 @@ int qlcnic_83xx_napi_add(struct qlcnic_adapter *adapter, | |||
1961 | struct qlcnic_host_tx_ring *tx_ring; | 1965 | struct qlcnic_host_tx_ring *tx_ring; |
1962 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; | 1966 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; |
1963 | 1967 | ||
1964 | if (qlcnic_alloc_sds_rings(recv_ctx, adapter->max_sds_rings)) | 1968 | if (qlcnic_alloc_sds_rings(recv_ctx, adapter->drv_sds_rings)) |
1965 | return -ENOMEM; | 1969 | return -ENOMEM; |
1966 | 1970 | ||
1967 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 1971 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { |
1968 | sds_ring = &recv_ctx->sds_rings[ring]; | 1972 | sds_ring = &recv_ctx->sds_rings[ring]; |
1969 | if (adapter->flags & QLCNIC_MSIX_ENABLED) { | 1973 | if (adapter->flags & QLCNIC_MSIX_ENABLED) { |
1970 | if (!(adapter->flags & QLCNIC_TX_INTR_SHARED)) | 1974 | if (!(adapter->flags & QLCNIC_TX_INTR_SHARED)) |
@@ -1990,7 +1994,7 @@ int qlcnic_83xx_napi_add(struct qlcnic_adapter *adapter, | |||
1990 | 1994 | ||
1991 | if ((adapter->flags & QLCNIC_MSIX_ENABLED) && | 1995 | if ((adapter->flags & QLCNIC_MSIX_ENABLED) && |
1992 | !(adapter->flags & QLCNIC_TX_INTR_SHARED)) { | 1996 | !(adapter->flags & QLCNIC_TX_INTR_SHARED)) { |
1993 | for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) { | 1997 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) { |
1994 | tx_ring = &adapter->tx_ring[ring]; | 1998 | tx_ring = &adapter->tx_ring[ring]; |
1995 | netif_napi_add(netdev, &tx_ring->napi, | 1999 | netif_napi_add(netdev, &tx_ring->napi, |
1996 | qlcnic_83xx_msix_tx_poll, | 2000 | qlcnic_83xx_msix_tx_poll, |
@@ -2008,7 +2012,7 @@ void qlcnic_83xx_napi_del(struct qlcnic_adapter *adapter) | |||
2008 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; | 2012 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; |
2009 | struct qlcnic_host_tx_ring *tx_ring; | 2013 | struct qlcnic_host_tx_ring *tx_ring; |
2010 | 2014 | ||
2011 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 2015 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { |
2012 | sds_ring = &recv_ctx->sds_rings[ring]; | 2016 | sds_ring = &recv_ctx->sds_rings[ring]; |
2013 | netif_napi_del(&sds_ring->napi); | 2017 | netif_napi_del(&sds_ring->napi); |
2014 | } | 2018 | } |
@@ -2017,7 +2021,7 @@ void qlcnic_83xx_napi_del(struct qlcnic_adapter *adapter) | |||
2017 | 2021 | ||
2018 | if ((adapter->flags & QLCNIC_MSIX_ENABLED) && | 2022 | if ((adapter->flags & QLCNIC_MSIX_ENABLED) && |
2019 | !(adapter->flags & QLCNIC_TX_INTR_SHARED)) { | 2023 | !(adapter->flags & QLCNIC_TX_INTR_SHARED)) { |
2020 | for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) { | 2024 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) { |
2021 | tx_ring = &adapter->tx_ring[ring]; | 2025 | tx_ring = &adapter->tx_ring[ring]; |
2022 | netif_napi_del(&tx_ring->napi); | 2026 | netif_napi_del(&tx_ring->napi); |
2023 | } | 2027 | } |