|
|
@@ -367,7 +367,6 @@ int netcp_register_module(struct netcp_module *module)
|
|
|
if (ret < 0)
|
|
|
goto fail;
|
|
|
}
|
|
|
-
|
|
|
mutex_unlock(&netcp_modules_lock);
|
|
|
return 0;
|
|
|
|
|
|
@@ -1395,7 +1394,6 @@ static void netcp_addr_sweep_del(struct netcp_intf *netcp)
|
|
|
continue;
|
|
|
dev_dbg(netcp->ndev_dev, "deleting address %pM, type %x\n",
|
|
|
naddr->addr, naddr->type);
|
|
|
- mutex_lock(&netcp_modules_lock);
|
|
|
for_each_module(netcp, priv) {
|
|
|
module = priv->netcp_module;
|
|
|
if (!module->del_addr)
|
|
|
@@ -1404,7 +1402,6 @@ static void netcp_addr_sweep_del(struct netcp_intf *netcp)
|
|
|
naddr);
|
|
|
WARN_ON(error);
|
|
|
}
|
|
|
- mutex_unlock(&netcp_modules_lock);
|
|
|
netcp_addr_del(netcp, naddr);
|
|
|
}
|
|
|
}
|
|
|
@@ -1421,7 +1418,7 @@ static void netcp_addr_sweep_add(struct netcp_intf *netcp)
|
|
|
continue;
|
|
|
dev_dbg(netcp->ndev_dev, "adding address %pM, type %x\n",
|
|
|
naddr->addr, naddr->type);
|
|
|
- mutex_lock(&netcp_modules_lock);
|
|
|
+
|
|
|
for_each_module(netcp, priv) {
|
|
|
module = priv->netcp_module;
|
|
|
if (!module->add_addr)
|
|
|
@@ -1429,7 +1426,6 @@ static void netcp_addr_sweep_add(struct netcp_intf *netcp)
|
|
|
error = module->add_addr(priv->module_priv, naddr);
|
|
|
WARN_ON(error);
|
|
|
}
|
|
|
- mutex_unlock(&netcp_modules_lock);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1443,6 +1439,7 @@ static void netcp_set_rx_mode(struct net_device *ndev)
|
|
|
ndev->flags & IFF_ALLMULTI ||
|
|
|
netdev_mc_count(ndev) > NETCP_MAX_MCAST_ADDR);
|
|
|
|
|
|
+ spin_lock(&netcp->lock);
|
|
|
/* first clear all marks */
|
|
|
netcp_addr_clear_mark(netcp);
|
|
|
|
|
|
@@ -1461,6 +1458,7 @@ static void netcp_set_rx_mode(struct net_device *ndev)
|
|
|
/* finally sweep and callout into modules */
|
|
|
netcp_addr_sweep_del(netcp);
|
|
|
netcp_addr_sweep_add(netcp);
|
|
|
+ spin_unlock(&netcp->lock);
|
|
|
}
|
|
|
|
|
|
static void netcp_free_navigator_resources(struct netcp_intf *netcp)
|
|
|
@@ -1625,7 +1623,6 @@ static int netcp_ndo_open(struct net_device *ndev)
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
|
- mutex_lock(&netcp_modules_lock);
|
|
|
for_each_module(netcp, intf_modpriv) {
|
|
|
module = intf_modpriv->netcp_module;
|
|
|
if (module->open) {
|
|
|
@@ -1636,7 +1633,6 @@ static int netcp_ndo_open(struct net_device *ndev)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- mutex_unlock(&netcp_modules_lock);
|
|
|
|
|
|
napi_enable(&netcp->rx_napi);
|
|
|
napi_enable(&netcp->tx_napi);
|
|
|
@@ -1653,7 +1649,6 @@ fail_open:
|
|
|
if (module->close)
|
|
|
module->close(intf_modpriv->module_priv, ndev);
|
|
|
}
|
|
|
- mutex_unlock(&netcp_modules_lock);
|
|
|
|
|
|
fail:
|
|
|
netcp_free_navigator_resources(netcp);
|
|
|
@@ -1677,7 +1672,6 @@ static int netcp_ndo_stop(struct net_device *ndev)
|
|
|
napi_disable(&netcp->rx_napi);
|
|
|
napi_disable(&netcp->tx_napi);
|
|
|
|
|
|
- mutex_lock(&netcp_modules_lock);
|
|
|
for_each_module(netcp, intf_modpriv) {
|
|
|
module = intf_modpriv->netcp_module;
|
|
|
if (module->close) {
|
|
|
@@ -1686,7 +1680,6 @@ static int netcp_ndo_stop(struct net_device *ndev)
|
|
|
dev_err(netcp->ndev_dev, "Close failed\n");
|
|
|
}
|
|
|
}
|
|
|
- mutex_unlock(&netcp_modules_lock);
|
|
|
|
|
|
/* Recycle Rx descriptors from completion queue */
|
|
|
netcp_empty_rx_queue(netcp);
|
|
|
@@ -1714,7 +1707,6 @@ static int netcp_ndo_ioctl(struct net_device *ndev,
|
|
|
if (!netif_running(ndev))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- mutex_lock(&netcp_modules_lock);
|
|
|
for_each_module(netcp, intf_modpriv) {
|
|
|
module = intf_modpriv->netcp_module;
|
|
|
if (!module->ioctl)
|
|
|
@@ -1730,7 +1722,6 @@ static int netcp_ndo_ioctl(struct net_device *ndev,
|
|
|
}
|
|
|
|
|
|
out:
|
|
|
- mutex_unlock(&netcp_modules_lock);
|
|
|
return (ret == 0) ? 0 : err;
|
|
|
}
|
|
|
|
|
|
@@ -1765,11 +1756,12 @@ static int netcp_rx_add_vid(struct net_device *ndev, __be16 proto, u16 vid)
|
|
|
struct netcp_intf *netcp = netdev_priv(ndev);
|
|
|
struct netcp_intf_modpriv *intf_modpriv;
|
|
|
struct netcp_module *module;
|
|
|
+ unsigned long flags;
|
|
|
int err = 0;
|
|
|
|
|
|
dev_dbg(netcp->ndev_dev, "adding rx vlan id: %d\n", vid);
|
|
|
|
|
|
- mutex_lock(&netcp_modules_lock);
|
|
|
+ spin_lock_irqsave(&netcp->lock, flags);
|
|
|
for_each_module(netcp, intf_modpriv) {
|
|
|
module = intf_modpriv->netcp_module;
|
|
|
if ((module->add_vid) && (vid != 0)) {
|
|
|
@@ -1781,7 +1773,8 @@ static int netcp_rx_add_vid(struct net_device *ndev, __be16 proto, u16 vid)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- mutex_unlock(&netcp_modules_lock);
|
|
|
+ spin_unlock_irqrestore(&netcp->lock, flags);
|
|
|
+
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
@@ -1790,11 +1783,12 @@ static int netcp_rx_kill_vid(struct net_device *ndev, __be16 proto, u16 vid)
|
|
|
struct netcp_intf *netcp = netdev_priv(ndev);
|
|
|
struct netcp_intf_modpriv *intf_modpriv;
|
|
|
struct netcp_module *module;
|
|
|
+ unsigned long flags;
|
|
|
int err = 0;
|
|
|
|
|
|
dev_dbg(netcp->ndev_dev, "removing rx vlan id: %d\n", vid);
|
|
|
|
|
|
- mutex_lock(&netcp_modules_lock);
|
|
|
+ spin_lock_irqsave(&netcp->lock, flags);
|
|
|
for_each_module(netcp, intf_modpriv) {
|
|
|
module = intf_modpriv->netcp_module;
|
|
|
if (module->del_vid) {
|
|
|
@@ -1806,7 +1800,7 @@ static int netcp_rx_kill_vid(struct net_device *ndev, __be16 proto, u16 vid)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- mutex_unlock(&netcp_modules_lock);
|
|
|
+ spin_unlock_irqrestore(&netcp->lock, flags);
|
|
|
return err;
|
|
|
}
|
|
|
|