aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorManish chopra <manish.chopra@qlogic.com>2014-01-23 17:18:31 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-23 19:13:09 -0500
commit2b018ad9fe26de71c56c9cfdec164cdf89cb6a1a (patch)
tree5f6c5e06cec3c5765a3ea5188278195856df56ee /drivers/net
parent2cc5752e49d72e955277231e6f462a7f6263aa22 (diff)
qlcnic: Update poll controller code path
Add support for MSI/MSI-X mode in poll controller routine. Signed-off-by: Manish Chopra <manish.chopra@qlogic.com> Signed-off-by: Shahed Shaikh <shahed.shaikh@qlogic.com> Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index b9c1e37a1a20..0cfa8a3344ac 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -2925,17 +2925,39 @@ static irqreturn_t qlcnic_msix_tx_intr(int irq, void *data)
2925#ifdef CONFIG_NET_POLL_CONTROLLER 2925#ifdef CONFIG_NET_POLL_CONTROLLER
2926static void qlcnic_poll_controller(struct net_device *netdev) 2926static void qlcnic_poll_controller(struct net_device *netdev)
2927{ 2927{
2928 int ring;
2929 struct qlcnic_host_sds_ring *sds_ring;
2930 struct qlcnic_adapter *adapter = netdev_priv(netdev); 2928 struct qlcnic_adapter *adapter = netdev_priv(netdev);
2931 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; 2929 struct qlcnic_host_sds_ring *sds_ring;
2930 struct qlcnic_recv_context *recv_ctx;
2931 struct qlcnic_host_tx_ring *tx_ring;
2932 int ring;
2933
2934 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
2935 return;
2936
2937 recv_ctx = adapter->recv_ctx;
2932 2938
2933 disable_irq(adapter->irq);
2934 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { 2939 for (ring = 0; ring < adapter->drv_sds_rings; ring++) {
2935 sds_ring = &recv_ctx->sds_rings[ring]; 2940 sds_ring = &recv_ctx->sds_rings[ring];
2936 qlcnic_intr(adapter->irq, sds_ring); 2941 qlcnic_disable_sds_intr(adapter, sds_ring);
2942 napi_schedule(&sds_ring->napi);
2943 }
2944
2945 if (adapter->flags & QLCNIC_MSIX_ENABLED) {
2946 /* Only Multi-Tx queue capable devices need to
2947 * schedule NAPI for TX rings
2948 */
2949 if ((qlcnic_83xx_check(adapter) &&
2950 (adapter->flags & QLCNIC_TX_INTR_SHARED)) ||
2951 (qlcnic_82xx_check(adapter) &&
2952 !qlcnic_check_multi_tx(adapter)))
2953 return;
2954
2955 for (ring = 0; ring < adapter->drv_tx_rings; ring++) {
2956 tx_ring = &adapter->tx_ring[ring];
2957 qlcnic_disable_tx_intr(adapter, tx_ring);
2958 napi_schedule(&tx_ring->napi);
2959 }
2937 } 2960 }
2938 enable_irq(adapter->irq);
2939} 2961}
2940#endif 2962#endif
2941 2963