|
@@ -1509,6 +1509,24 @@ static void netcp_addr_sweep_add(struct netcp_intf *netcp)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static int netcp_set_promiscuous(struct netcp_intf *netcp, bool promisc)
|
|
|
+{
|
|
|
+ struct netcp_intf_modpriv *priv;
|
|
|
+ struct netcp_module *module;
|
|
|
+ int error;
|
|
|
+
|
|
|
+ for_each_module(netcp, priv) {
|
|
|
+ module = priv->netcp_module;
|
|
|
+ if (!module->set_rx_mode)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ error = module->set_rx_mode(priv->module_priv, promisc);
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static void netcp_set_rx_mode(struct net_device *ndev)
|
|
|
{
|
|
|
struct netcp_intf *netcp = netdev_priv(ndev);
|
|
@@ -1538,6 +1556,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);
|
|
|
+ netcp_set_promiscuous(netcp, promisc);
|
|
|
spin_unlock(&netcp->lock);
|
|
|
}
|
|
|
|