aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHimanshu Madhani <himanshu.madhani@qlogic.com>2013-11-04 13:31:32 -0500
committerDavid S. Miller <davem@davemloft.net>2013-11-04 15:33:19 -0500
commit18afc102fdcb95d6c7d57f2967a06f2f8fe3ba4c (patch)
treee7e493fb94fc80fb3ebde4adc5586d9b57625a42
parent34e8c406fda5b5a9d2e126a92bab84cd28e3b5fa (diff)
qlcnic: Enable multiple Tx queue support for 83xx/84xx Series adapters.
o 83xx and 84xx firmware is capable of multiple Tx queues. This patch will enable multiple Tx queues for 83xx/84xx series adapters. Max number of Tx queues supported will be 8. Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c4
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c18
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c5
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c6
5 files changed, 18 insertions, 17 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index df6c6f51c609..09810ddd11ec 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -1654,6 +1654,7 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode)
1654 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1654 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1655 struct qlcnic_hardware_context *ahw = adapter->ahw; 1655 struct qlcnic_hardware_context *ahw = adapter->ahw;
1656 u8 drv_sds_rings = adapter->drv_sds_rings; 1656 u8 drv_sds_rings = adapter->drv_sds_rings;
1657 u8 drv_tx_rings = adapter->drv_tx_rings;
1657 int ret = 0, loop = 0; 1658 int ret = 0, loop = 0;
1658 1659
1659 if (ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { 1660 if (ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
@@ -1718,6 +1719,7 @@ free_diag_res:
1718 1719
1719fail_diag_alloc: 1720fail_diag_alloc:
1720 adapter->drv_sds_rings = drv_sds_rings; 1721 adapter->drv_sds_rings = drv_sds_rings;
1722 adapter->drv_tx_rings = drv_tx_rings;
1721 qlcnic_release_diag_lock(adapter); 1723 qlcnic_release_diag_lock(adapter);
1722 return ret; 1724 return ret;
1723} 1725}
@@ -3303,6 +3305,7 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev)
3303 struct qlcnic_hardware_context *ahw = adapter->ahw; 3305 struct qlcnic_hardware_context *ahw = adapter->ahw;
3304 struct qlcnic_cmd_args cmd; 3306 struct qlcnic_cmd_args cmd;
3305 u8 val, drv_sds_rings = adapter->drv_sds_rings; 3307 u8 val, drv_sds_rings = adapter->drv_sds_rings;
3308 u8 drv_tx_rings = adapter->drv_tx_rings;
3306 u32 data; 3309 u32 data;
3307 u16 intrpt_id, id; 3310 u16 intrpt_id, id;
3308 int ret; 3311 int ret;
@@ -3359,6 +3362,7 @@ done:
3359 3362
3360fail_diag_irq: 3363fail_diag_irq:
3361 adapter->drv_sds_rings = drv_sds_rings; 3364 adapter->drv_sds_rings = drv_sds_rings;
3365 adapter->drv_tx_rings = drv_tx_rings;
3362 qlcnic_release_diag_lock(adapter); 3366 qlcnic_release_diag_lock(adapter);
3363 return ret; 3367 return ret;
3364} 3368}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
index 5682a40eb8a7..89208e5b25d6 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
@@ -2068,13 +2068,13 @@ int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter)
2068 return -EIO; 2068 return -EIO;
2069 2069
2070 adapter->max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS; 2070 adapter->max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS;
2071 adapter->max_tx_rings = QLCNIC_SINGLE_RING; 2071 adapter->max_tx_rings = QLCNIC_MAX_VNIC_TX_RINGS;
2072 } else if (ret == QLC_83XX_DEFAULT_OPMODE) { 2072 } else if (ret == QLC_83XX_DEFAULT_OPMODE) {
2073 ahw->nic_mode = QLCNIC_DEFAULT_MODE; 2073 ahw->nic_mode = QLCNIC_DEFAULT_MODE;
2074 adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver; 2074 adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver;
2075 ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; 2075 ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
2076 adapter->max_sds_rings = ahw->max_rx_ques; 2076 adapter->max_sds_rings = ahw->max_rx_ques;
2077 adapter->max_tx_rings = QLCNIC_SINGLE_RING; 2077 adapter->max_tx_rings = ahw->max_tx_ques;
2078 } else { 2078 } else {
2079 return -EIO; 2079 return -EIO;
2080 } 2080 }
@@ -2179,16 +2179,20 @@ static int qlcnic_83xx_get_fw_info(struct qlcnic_adapter *adapter)
2179 2179
2180static void qlcnic_83xx_init_rings(struct qlcnic_adapter *adapter) 2180static void qlcnic_83xx_init_rings(struct qlcnic_adapter *adapter)
2181{ 2181{
2182 u8 rx_cnt = QLCNIC_DEF_SDS_RINGS;
2183 u8 tx_cnt = QLCNIC_DEF_TX_RINGS;
2184
2182 adapter->max_tx_rings = QLCNIC_MAX_TX_RINGS; 2185 adapter->max_tx_rings = QLCNIC_MAX_TX_RINGS;
2183 adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS; 2186 adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS;
2184 2187
2185 qlcnic_set_tx_ring_count(adapter, QLCNIC_SINGLE_RING); 2188 if (!adapter->ahw->msix_supported) {
2189 rx_cnt = QLCNIC_SINGLE_RING;
2190 tx_cnt = QLCNIC_SINGLE_RING;
2191 }
2186 2192
2187 /* compute and set drv sds rings */ 2193 /* compute and set drv sds rings */
2188 if (adapter->ahw->msix_supported) 2194 qlcnic_set_tx_ring_count(adapter, tx_cnt);
2189 qlcnic_set_sds_ring_count(adapter, QLCNIC_DEF_SDS_RINGS); 2195 qlcnic_set_sds_ring_count(adapter, rx_cnt);
2190 else
2191 qlcnic_set_sds_ring_count(adapter, QLCNIC_SINGLE_RING);
2192} 2196}
2193 2197
2194int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac) 2198int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
index 225743cc82eb..b36c02fafcfd 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
@@ -731,7 +731,7 @@ static int qlcnic_set_channels(struct net_device *dev,
731 } 731 }
732 } 732 }
733 733
734 if (qlcnic_82xx_check(adapter) && channel->tx_count) { 734 if (channel->tx_count) {
735 err = qlcnic_validate_rings(adapter, channel->tx_count, 735 err = qlcnic_validate_rings(adapter, channel->tx_count,
736 QLCNIC_TX_QUEUE); 736 QLCNIC_TX_QUEUE);
737 if (err) { 737 if (err) {
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
index 1c07ec250f23..0149c9495347 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
@@ -581,10 +581,7 @@ netdev_tx_t qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
581 goto drop_packet; 581 goto drop_packet;
582 } 582 }
583 583
584 if (qlcnic_check_multi_tx(adapter)) 584 tx_ring = &adapter->tx_ring[skb_get_queue_mapping(skb)];
585 tx_ring = &adapter->tx_ring[skb_get_queue_mapping(skb)];
586 else
587 tx_ring = &adapter->tx_ring[0];
588 num_txd = tx_ring->num_desc; 585 num_txd = tx_ring->num_desc;
589 586
590 frag_count = skb_shinfo(skb)->nr_frags + 1; 587 frag_count = skb_shinfo(skb)->nr_frags + 1;
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 007b7df73510..05c1eef8df13 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -3710,11 +3710,7 @@ int qlcnic_validate_rings(struct qlcnic_adapter *adapter, __u32 ring_cnt,
3710 cur_rings = adapter->drv_sds_rings; 3710 cur_rings = adapter->drv_sds_rings;
3711 strcpy(buf, "SDS"); 3711 strcpy(buf, "SDS");
3712 } else if (queue_type == QLCNIC_TX_QUEUE) { 3712 } else if (queue_type == QLCNIC_TX_QUEUE) {
3713 if (qlcnic_83xx_check(adapter)) 3713 max_hw_rings = adapter->max_tx_rings;
3714 max_hw_rings = QLCNIC_SINGLE_RING;
3715 else
3716 max_hw_rings = adapter->max_tx_rings;
3717
3718 cur_rings = adapter->drv_tx_rings; 3714 cur_rings = adapter->drv_tx_rings;
3719 strcpy(buf, "Tx"); 3715 strcpy(buf, "Tx");
3720 } 3716 }