diff options
author | Himanshu Madhani <himanshu.madhani@qlogic.com> | 2013-11-04 13:31:32 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-11-04 15:33:19 -0500 |
commit | 18afc102fdcb95d6c7d57f2967a06f2f8fe3ba4c (patch) | |
tree | e7e493fb94fc80fb3ebde4adc5586d9b57625a42 | |
parent | 34e8c406fda5b5a9d2e126a92bab84cd28e3b5fa (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>
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 | ||
1719 | fail_diag_alloc: | 1720 | fail_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 | ||
3360 | fail_diag_irq: | 3363 | fail_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 | ||
2180 | static void qlcnic_83xx_init_rings(struct qlcnic_adapter *adapter) | 2180 | static 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 | ||
2194 | int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac) | 2198 | int 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 | } |