Skip to content

Commit

Permalink
net: netcp: add api to support set rx mode in netcp modules
Browse files Browse the repository at this point in the history
This patch adds an API to support setting rx mode in
netcp modules.  If a netcp module needs to be notified
when upper layer transitions from one rx mode to
another and react accordingly, such a module will implement
the new API set_rx_mode added in this patch.  Currently
rx modes supported are PROMISCUOUS and NON_PROMISCUOUS
modes.

Signed-off-by: WingMan Kwok <w-kwok2@ti.com>
Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
WingMan Kwok authored and David S. Miller committed Apr 19, 2018
1 parent 21f706b commit 0542a87
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 0 deletions.
1 change: 1 addition & 0 deletions drivers/net/ethernet/ti/netcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ struct netcp_module {
int (*add_vid)(void *intf_priv, int vid);
int (*del_vid)(void *intf_priv, int vid);
int (*ioctl)(void *intf_priv, struct ifreq *req, int cmd);
int (*set_rx_mode)(void *intf_priv, bool promisc);

/* used internally */
struct list_head module_list;
Expand Down
19 changes: 19 additions & 0 deletions drivers/net/ethernet/ti/netcp_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}

Expand Down

0 comments on commit 0542a87

Please sign in to comment.