Commit a69faa09 authored by Michal Kubecek's avatar Michal Kubecek Committed by David S. Miller

wil6210: get rid of begin() and complete() ethtool_ops

The wil6210 driver locks a mutex in begin() ethtool_ops callback and
unlocks it in complete() so that all ethtool requests are serialized. This
is not going to work correctly with netlink interface; e.g. when ioctl
triggers a netlink notification, netlink code would call begin() again
while the mutex taken by ioctl code is still held by the same task.

Let's get rid of the begin() and complete() callbacks and move the mutex
locking into the remaining ethtool_ops handlers except get_drvinfo which
only copies strings that are not changing so that there is no need for
serialization.
Signed-off-by: default avatarMichal Kubecek <mkubecek@suse.cz>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 17aa23ee
...@@ -11,26 +11,6 @@ ...@@ -11,26 +11,6 @@
#include "wil6210.h" #include "wil6210.h"
static int wil_ethtoolops_begin(struct net_device *ndev)
{
struct wil6210_priv *wil = ndev_to_wil(ndev);
mutex_lock(&wil->mutex);
wil_dbg_misc(wil, "ethtoolops_begin\n");
return 0;
}
static void wil_ethtoolops_complete(struct net_device *ndev)
{
struct wil6210_priv *wil = ndev_to_wil(ndev);
wil_dbg_misc(wil, "ethtoolops_complete\n");
mutex_unlock(&wil->mutex);
}
static int wil_ethtoolops_get_coalesce(struct net_device *ndev, static int wil_ethtoolops_get_coalesce(struct net_device *ndev,
struct ethtool_coalesce *cp) struct ethtool_coalesce *cp)
{ {
...@@ -39,11 +19,12 @@ static int wil_ethtoolops_get_coalesce(struct net_device *ndev, ...@@ -39,11 +19,12 @@ static int wil_ethtoolops_get_coalesce(struct net_device *ndev,
u32 rx_itr_en, rx_itr_val = 0; u32 rx_itr_en, rx_itr_val = 0;
int ret; int ret;
mutex_lock(&wil->mutex);
wil_dbg_misc(wil, "ethtoolops_get_coalesce\n"); wil_dbg_misc(wil, "ethtoolops_get_coalesce\n");
ret = wil_pm_runtime_get(wil); ret = wil_pm_runtime_get(wil);
if (ret < 0) if (ret < 0)
return ret; goto out;
tx_itr_en = wil_r(wil, RGF_DMA_ITR_TX_CNT_CTL); tx_itr_en = wil_r(wil, RGF_DMA_ITR_TX_CNT_CTL);
if (tx_itr_en & BIT_DMA_ITR_TX_CNT_CTL_EN) if (tx_itr_en & BIT_DMA_ITR_TX_CNT_CTL_EN)
...@@ -57,7 +38,11 @@ static int wil_ethtoolops_get_coalesce(struct net_device *ndev, ...@@ -57,7 +38,11 @@ static int wil_ethtoolops_get_coalesce(struct net_device *ndev,
cp->tx_coalesce_usecs = tx_itr_val; cp->tx_coalesce_usecs = tx_itr_val;
cp->rx_coalesce_usecs = rx_itr_val; cp->rx_coalesce_usecs = rx_itr_val;
return 0; ret = 0;
out:
mutex_unlock(&wil->mutex);
return ret;
} }
static int wil_ethtoolops_set_coalesce(struct net_device *ndev, static int wil_ethtoolops_set_coalesce(struct net_device *ndev,
...@@ -67,12 +52,14 @@ static int wil_ethtoolops_set_coalesce(struct net_device *ndev, ...@@ -67,12 +52,14 @@ static int wil_ethtoolops_set_coalesce(struct net_device *ndev,
struct wireless_dev *wdev = ndev->ieee80211_ptr; struct wireless_dev *wdev = ndev->ieee80211_ptr;
int ret; int ret;
mutex_lock(&wil->mutex);
wil_dbg_misc(wil, "ethtoolops_set_coalesce: rx %d usec, tx %d usec\n", wil_dbg_misc(wil, "ethtoolops_set_coalesce: rx %d usec, tx %d usec\n",
cp->rx_coalesce_usecs, cp->tx_coalesce_usecs); cp->rx_coalesce_usecs, cp->tx_coalesce_usecs);
if (wdev->iftype == NL80211_IFTYPE_MONITOR) { if (wdev->iftype == NL80211_IFTYPE_MONITOR) {
wil_dbg_misc(wil, "No IRQ coalescing in monitor mode\n"); wil_dbg_misc(wil, "No IRQ coalescing in monitor mode\n");
return -EINVAL; ret = -EINVAL;
goto out;
} }
/* only @rx_coalesce_usecs and @tx_coalesce_usecs supported, /* only @rx_coalesce_usecs and @tx_coalesce_usecs supported,
...@@ -88,24 +75,26 @@ static int wil_ethtoolops_set_coalesce(struct net_device *ndev, ...@@ -88,24 +75,26 @@ static int wil_ethtoolops_set_coalesce(struct net_device *ndev,
ret = wil_pm_runtime_get(wil); ret = wil_pm_runtime_get(wil);
if (ret < 0) if (ret < 0)
return ret; goto out;
wil->txrx_ops.configure_interrupt_moderation(wil); wil->txrx_ops.configure_interrupt_moderation(wil);
wil_pm_runtime_put(wil); wil_pm_runtime_put(wil);
ret = 0;
return 0; out:
mutex_unlock(&wil->mutex);
return ret;
out_bad: out_bad:
wil_dbg_misc(wil, "Unsupported coalescing params. Raw command:\n"); wil_dbg_misc(wil, "Unsupported coalescing params. Raw command:\n");
print_hex_dump_debug("DBG[MISC] coal ", DUMP_PREFIX_OFFSET, 16, 4, print_hex_dump_debug("DBG[MISC] coal ", DUMP_PREFIX_OFFSET, 16, 4,
cp, sizeof(*cp), false); cp, sizeof(*cp), false);
mutex_unlock(&wil->mutex);
return -EINVAL; return -EINVAL;
} }
static const struct ethtool_ops wil_ethtool_ops = { static const struct ethtool_ops wil_ethtool_ops = {
.begin = wil_ethtoolops_begin,
.complete = wil_ethtoolops_complete,
.get_drvinfo = cfg80211_get_drvinfo, .get_drvinfo = cfg80211_get_drvinfo,
.get_coalesce = wil_ethtoolops_get_coalesce, .get_coalesce = wil_ethtoolops_get_coalesce,
.set_coalesce = wil_ethtoolops_set_coalesce, .set_coalesce = wil_ethtoolops_set_coalesce,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment