ctx = &efx->rss_context.priv;
 
-       mutex_lock(&net_dev->ethtool->rss_lock);
        if (info->rss_context) {
                ctx = efx_find_rss_context_entry(efx, info->rss_context);
-               if (!ctx) {
-                       rc = -ENOENT;
-                       goto out_unlock;
-               }
+               if (!ctx)
+                       return -ENOENT;
        }
 
        data = 0;
        }
 out_setdata_unlock:
        info->data = data;
-out_unlock:
-       mutex_unlock(&net_dev->ethtool->rss_lock);
        return rc;
 }
 
 
        if (info.flow_type & FLOW_RSS)
                fields.rss_context = info.rss_context;
 
-       return ops->set_rxfh_fields(dev, &fields, NULL);
+       mutex_lock(&dev->ethtool->rss_lock);
+       rc = ops->set_rxfh_fields(dev, &fields, NULL);
+       mutex_unlock(&dev->ethtool->rss_lock);
+       return rc;
 }
 
 static noinline_for_stack int
        if (info.flow_type & FLOW_RSS)
                fields.rss_context = info.rss_context;
 
+       mutex_lock(&dev->ethtool->rss_lock);
        ret = ops->get_rxfh_fields(dev, &fields);
+       mutex_unlock(&dev->ethtool->rss_lock);
        if (ret < 0)
                return ret;
 
             rxfh.input_xfrm == RXH_XFRM_NO_CHANGE))
                return -EINVAL;
 
-       ret = ethtool_check_flow_types(dev, rxfh.input_xfrm);
-       if (ret)
-               return ret;
-
        indir_bytes = dev_indir_size * sizeof(rxfh_dev.indir[0]);
 
        /* Check settings which may be global rather than per RSS-context */
 
        mutex_lock(&dev->ethtool->rss_lock);
 
+       ret = ethtool_check_flow_types(dev, rxfh.input_xfrm);
+       if (ret)
+               goto out_unlock;
+
        if (rxfh.rss_context && rxfh_dev.rss_delete) {
                ret = ethtool_check_rss_ctx_busy(dev, rxfh.rss_context);
                if (ret)