aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
diff options
context:
space:
mode:
authorHimanshu Madhani <himanshu.madhani@qlogic.com>2013-11-04 13:31:31 -0500
committerDavid S. Miller <davem@davemloft.net>2013-11-04 15:33:19 -0500
commit34e8c406fda5b5a9d2e126a92bab84cd28e3b5fa (patch)
tree7867f7b76c97c693425d76e424ce54aa7e0dcbd2 /drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
parentf27c75b3903ab02bfe295aa58ad61ef5b756b065 (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.c46
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 }