]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ice: Implement ethtool hook for RSS switch
authorMd Fahad Iqbal Polash <md.fahad.iqbal.polash@intel.com>
Thu, 20 Sep 2018 00:23:17 +0000 (17:23 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 2 Oct 2018 14:17:18 +0000 (07:17 -0700)
This patch implements ethtool hook for enabling/disabling
RSS. While disabling RSS, the LUT should be cleared. And
the LUT should be reconfigured while enabling RSS.

Signed-off-by: Md Fahad Iqbal Polash <md.fahad.iqbal.polash@intel.com>
Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ice/ice_lib.c
drivers/net/ethernet/intel/ice/ice_lib.h
drivers/net/ethernet/intel/ice/ice_main.c

index 8f7ee77cb70baa39956b3075a6369a0595aa47e6..98e8b7096e47547637313e29e28a944d764aea2d 100644 (file)
@@ -1222,6 +1222,38 @@ static void ice_vsi_map_rings_to_vectors(struct ice_vsi *vsi)
        }
 }
 
+/**
+ * ice_vsi_manage_rss_lut - disable/enable RSS
+ * @vsi: the VSI being changed
+ * @ena: boolean value indicating if this is an enable or disable request
+ *
+ * In the event of disable request for RSS, this function will zero out RSS
+ * LUT, while in the event of enable request for RSS, it will reconfigure RSS
+ * LUT.
+ */
+int ice_vsi_manage_rss_lut(struct ice_vsi *vsi, bool ena)
+{
+       int err = 0;
+       u8 *lut;
+
+       lut = devm_kzalloc(&vsi->back->pdev->dev, vsi->rss_table_size,
+                          GFP_KERNEL);
+       if (!lut)
+               return -ENOMEM;
+
+       if (ena) {
+               if (vsi->rss_lut_user)
+                       memcpy(lut, vsi->rss_lut_user, vsi->rss_table_size);
+               else
+                       ice_fill_rss_lut(lut, vsi->rss_table_size,
+                                        vsi->rss_size);
+       }
+
+       err = ice_set_rss(vsi, NULL, lut, vsi->rss_table_size);
+       devm_kfree(&vsi->back->pdev->dev, lut);
+       return err;
+}
+
 /**
  * ice_vsi_cfg_rss_lut_key - Configure RSS params for a VSI
  * @vsi: VSI to be configured
index 4265464ee3d37d27b2ff9dadfdc1a858d3504bf6..2617afe01c8203da8b747d9e3683a385158f081c 100644 (file)
@@ -70,5 +70,7 @@ void ice_vsi_free_tx_rings(struct ice_vsi *vsi);
 
 int ice_vsi_cfg_tc(struct ice_vsi *vsi, u8 ena_tc);
 
+int ice_vsi_manage_rss_lut(struct ice_vsi *vsi, bool ena);
+
 irqreturn_t ice_msix_clean_rings(int __always_unused irq, void *data);
 #endif /* !_ICE_LIB_H_ */
index d9f30d15ad65ecf7b4f75fdee786ed6216b3c1f7..bb76a0bf2fd15b31091b172e473f16fe6bcf4e87 100644 (file)
@@ -2412,6 +2412,12 @@ static int ice_set_features(struct net_device *netdev,
        struct ice_vsi *vsi = np->vsi;
        int ret = 0;
 
+       if (features & NETIF_F_RXHASH && !(netdev->features & NETIF_F_RXHASH))
+               ret = ice_vsi_manage_rss_lut(vsi, true);
+       else if (!(features & NETIF_F_RXHASH) &&
+                netdev->features & NETIF_F_RXHASH)
+               ret = ice_vsi_manage_rss_lut(vsi, false);
+
        if ((features & NETIF_F_HW_VLAN_CTAG_RX) &&
            !(netdev->features & NETIF_F_HW_VLAN_CTAG_RX))
                ret = ice_vsi_manage_vlan_stripping(vsi, true);