enic: fix return values in enic_set_coalesce
authorGovindarajulu Varadarajan <_govind@gmx.com>
Wed, 2 Jul 2014 10:12:15 +0000 (15:42 +0530)
committerDavid S. Miller <davem@davemloft.net>
Tue, 8 Jul 2014 04:33:46 +0000 (21:33 -0700)
enic_set_coalesce() has two problems.

* It should return -EINVAL and not -EOPNOTSUPP for invalid coalesce values.

* In case of MSIX, enic_set_coalesce return error after applying requested
  coalescing setting partially. We should either apply all the setting requeste
  and return success or apply non and return error.

* This patch also simplifies the algo.

This was introduced by
'7c2ce6e60f703 enic: Add support for adaptive interrupt coalescing'

These changes were suggested by Ben Hutchings here
http://www.spinics.net/lists/netdev/msg283972.html

Also change enic driver version.

Signed-off-by: Govindarajulu Varadarajan <_govind@gmx.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/cisco/enic/enic.h
drivers/net/ethernet/cisco/enic/enic_ethtool.c

index c8aa9fb81d3c21eeac5c544ab19349f6574a98ba..4ecbbb3c024a9475c613bc3261f5b3a277d6679b 100644 (file)
@@ -33,7 +33,7 @@
 
 #define DRV_NAME               "enic"
 #define DRV_DESCRIPTION                "Cisco VIC Ethernet NIC Driver"
-#define DRV_VERSION            "2.1.1.50"
+#define DRV_VERSION            "2.1.1.67"
 #define DRV_COPYRIGHT          "Copyright 2008-2013 Cisco Systems, Inc"
 
 #define ENIC_BARS_MAX          6
index 2e50b5489d204158e89b93dfdb7be09cfba2d8c9..c75f84b42751e66ad23d6dbdcf522f5baec087f7 100644 (file)
@@ -231,7 +231,7 @@ static int enic_set_coalesce(struct net_device *netdev,
                if (ecmd->use_adaptive_rx_coalesce      ||
                    ecmd->rx_coalesce_usecs_low         ||
                    ecmd->rx_coalesce_usecs_high)
-                       return -EOPNOTSUPP;
+                       return -EINVAL;
 
                intr = enic_legacy_io_intr();
                vnic_intr_coalescing_timer_set(&enic->intr[intr],
@@ -243,34 +243,29 @@ static int enic_set_coalesce(struct net_device *netdev,
                if (ecmd->use_adaptive_rx_coalesce      ||
                    ecmd->rx_coalesce_usecs_low         ||
                    ecmd->rx_coalesce_usecs_high)
-                       return -EOPNOTSUPP;
+                       return -EINVAL;
 
                vnic_intr_coalescing_timer_set(&enic->intr[0],
                        tx_coalesce_usecs);
                break;
        case VNIC_DEV_INTR_MODE_MSIX:
+               if (ecmd->rx_coalesce_usecs_high &&
+                   (rx_coalesce_usecs_high <
+                    rx_coalesce_usecs_low + ENIC_AIC_LARGE_PKT_DIFF))
+                               return -EINVAL;
+
                for (i = 0; i < enic->wq_count; i++) {
                        intr = enic_msix_wq_intr(enic, i);
                        vnic_intr_coalescing_timer_set(&enic->intr[intr],
                                tx_coalesce_usecs);
                }
 
-               if (rxcoal->use_adaptive_rx_coalesce) {
-                       if (!ecmd->use_adaptive_rx_coalesce) {
-                               rxcoal->use_adaptive_rx_coalesce = 0;
-                               enic_intr_coal_set_rx(enic, rx_coalesce_usecs);
-                       }
-               } else {
-                       if (ecmd->use_adaptive_rx_coalesce)
-                               rxcoal->use_adaptive_rx_coalesce = 1;
-                       else
-                               enic_intr_coal_set_rx(enic, rx_coalesce_usecs);
-               }
+               rxcoal->use_adaptive_rx_coalesce =
+                                       !!ecmd->use_adaptive_rx_coalesce;
+               if (!rxcoal->use_adaptive_rx_coalesce)
+                       enic_intr_coal_set_rx(enic, rx_coalesce_usecs);
 
                if (ecmd->rx_coalesce_usecs_high) {
-                       if (rx_coalesce_usecs_high <
-                           (rx_coalesce_usecs_low + ENIC_AIC_LARGE_PKT_DIFF))
-                               return -EINVAL;
                        rxcoal->range_end = rx_coalesce_usecs_high;
                        rxcoal->small_pkt_range_start = rx_coalesce_usecs_low;
                        rxcoal->large_pkt_range_start = rx_coalesce_usecs_low +