Commit 33b86ba0 authored by David S. Miller's avatar David S. Miller

Merge branch 'NCSI-vlan-filtering'

Samuel Mendoza-Jonas says:

====================
NCSI VLAN Filtering Support

This series (mainly patch 2) adds VLAN filtering to the NCSI implementation.
A fair amount of code already exists in the NCSI stack for VLAN filtering but
none of it is actually hooked up. This goes the final mile and fixes a few
bugs in the existing code found along the way (patch 1).

Patch 3 adds the appropriate flag and callbacks to the ftgmac100 driver to
enable filtering as it's a large consumer of NCSI (and what I've been
testing on).

v3:	- Add comment describing change to ncsi_find_filter()
	- Catch NULL in clear_one_vid() from ncsi_get_filter()
	- Simplify state changes when kicking updated channel
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents a74e344a 51564585
...@@ -1623,6 +1623,8 @@ static const struct net_device_ops ftgmac100_netdev_ops = { ...@@ -1623,6 +1623,8 @@ static const struct net_device_ops ftgmac100_netdev_ops = {
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = ftgmac100_poll_controller, .ndo_poll_controller = ftgmac100_poll_controller,
#endif #endif
.ndo_vlan_rx_add_vid = ncsi_vlan_rx_add_vid,
.ndo_vlan_rx_kill_vid = ncsi_vlan_rx_kill_vid,
}; };
static int ftgmac100_setup_mdio(struct net_device *netdev) static int ftgmac100_setup_mdio(struct net_device *netdev)
...@@ -1837,6 +1839,9 @@ static int ftgmac100_probe(struct platform_device *pdev) ...@@ -1837,6 +1839,9 @@ static int ftgmac100_probe(struct platform_device *pdev)
NETIF_F_GRO | NETIF_F_SG | NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_GRO | NETIF_F_SG | NETIF_F_HW_VLAN_CTAG_RX |
NETIF_F_HW_VLAN_CTAG_TX; NETIF_F_HW_VLAN_CTAG_TX;
if (priv->use_ncsi)
netdev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
/* AST2400 doesn't have working HW checksum generation */ /* AST2400 doesn't have working HW checksum generation */
if (np && (of_device_is_compatible(np, "aspeed,ast2400-mac"))) if (np && (of_device_is_compatible(np, "aspeed,ast2400-mac")))
netdev->hw_features &= ~NETIF_F_HW_CSUM; netdev->hw_features &= ~NETIF_F_HW_CSUM;
......
...@@ -28,6 +28,8 @@ struct ncsi_dev { ...@@ -28,6 +28,8 @@ struct ncsi_dev {
}; };
#ifdef CONFIG_NET_NCSI #ifdef CONFIG_NET_NCSI
int ncsi_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid);
int ncsi_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, u16 vid);
struct ncsi_dev *ncsi_register_dev(struct net_device *dev, struct ncsi_dev *ncsi_register_dev(struct net_device *dev,
void (*notifier)(struct ncsi_dev *nd)); void (*notifier)(struct ncsi_dev *nd));
int ncsi_start_dev(struct ncsi_dev *nd); int ncsi_start_dev(struct ncsi_dev *nd);
......
...@@ -180,6 +180,7 @@ struct ncsi_channel { ...@@ -180,6 +180,7 @@ struct ncsi_channel {
#define NCSI_CHANNEL_INACTIVE 1 #define NCSI_CHANNEL_INACTIVE 1
#define NCSI_CHANNEL_ACTIVE 2 #define NCSI_CHANNEL_ACTIVE 2
#define NCSI_CHANNEL_INVISIBLE 3 #define NCSI_CHANNEL_INVISIBLE 3
bool reconfigure_needed;
spinlock_t lock; /* Protect filters etc */ spinlock_t lock; /* Protect filters etc */
struct ncsi_package *package; struct ncsi_package *package;
struct ncsi_channel_version version; struct ncsi_channel_version version;
...@@ -235,6 +236,9 @@ enum { ...@@ -235,6 +236,9 @@ enum {
ncsi_dev_state_probe_dp, ncsi_dev_state_probe_dp,
ncsi_dev_state_config_sp = 0x0301, ncsi_dev_state_config_sp = 0x0301,
ncsi_dev_state_config_cis, ncsi_dev_state_config_cis,
ncsi_dev_state_config_clear_vids,
ncsi_dev_state_config_svf,
ncsi_dev_state_config_ev,
ncsi_dev_state_config_sma, ncsi_dev_state_config_sma,
ncsi_dev_state_config_ebf, ncsi_dev_state_config_ebf,
#if IS_ENABLED(CONFIG_IPV6) #if IS_ENABLED(CONFIG_IPV6)
...@@ -253,6 +257,12 @@ enum { ...@@ -253,6 +257,12 @@ enum {
ncsi_dev_state_suspend_done ncsi_dev_state_suspend_done
}; };
struct vlan_vid {
struct list_head list;
__be16 proto;
u16 vid;
};
struct ncsi_dev_priv { struct ncsi_dev_priv {
struct ncsi_dev ndev; /* Associated NCSI device */ struct ncsi_dev ndev; /* Associated NCSI device */
unsigned int flags; /* NCSI device flags */ unsigned int flags; /* NCSI device flags */
...@@ -276,6 +286,7 @@ struct ncsi_dev_priv { ...@@ -276,6 +286,7 @@ struct ncsi_dev_priv {
struct work_struct work; /* For channel management */ struct work_struct work; /* For channel management */
struct packet_type ptype; /* NCSI packet Rx handler */ struct packet_type ptype; /* NCSI packet Rx handler */
struct list_head node; /* Form NCSI device list */ struct list_head node; /* Form NCSI device list */
struct list_head vlan_vids; /* List of active VLAN IDs */
}; };
struct ncsi_cmd_arg { struct ncsi_cmd_arg {
......
...@@ -139,9 +139,9 @@ static int ncsi_cmd_handler_svf(struct sk_buff *skb, ...@@ -139,9 +139,9 @@ static int ncsi_cmd_handler_svf(struct sk_buff *skb,
struct ncsi_cmd_svf_pkt *cmd; struct ncsi_cmd_svf_pkt *cmd;
cmd = skb_put_zero(skb, sizeof(*cmd)); cmd = skb_put_zero(skb, sizeof(*cmd));
cmd->vlan = htons(nca->words[0]); cmd->vlan = htons(nca->words[1]);
cmd->index = nca->bytes[2]; cmd->index = nca->bytes[6];
cmd->enable = nca->bytes[3]; cmd->enable = nca->bytes[7];
ncsi_cmd_build_header(&cmd->cmd.common, nca); ncsi_cmd_build_header(&cmd->cmd.common, nca);
return 0; return 0;
...@@ -153,7 +153,7 @@ static int ncsi_cmd_handler_ev(struct sk_buff *skb, ...@@ -153,7 +153,7 @@ static int ncsi_cmd_handler_ev(struct sk_buff *skb,
struct ncsi_cmd_ev_pkt *cmd; struct ncsi_cmd_ev_pkt *cmd;
cmd = skb_put_zero(skb, sizeof(*cmd)); cmd = skb_put_zero(skb, sizeof(*cmd));
cmd->mode = nca->bytes[0]; cmd->mode = nca->bytes[3];
ncsi_cmd_build_header(&cmd->cmd.common, nca); ncsi_cmd_build_header(&cmd->cmd.common, nca);
return 0; return 0;
...@@ -228,7 +228,7 @@ static struct ncsi_cmd_handler { ...@@ -228,7 +228,7 @@ static struct ncsi_cmd_handler {
{ NCSI_PKT_CMD_AE, 8, ncsi_cmd_handler_ae }, { NCSI_PKT_CMD_AE, 8, ncsi_cmd_handler_ae },
{ NCSI_PKT_CMD_SL, 8, ncsi_cmd_handler_sl }, { NCSI_PKT_CMD_SL, 8, ncsi_cmd_handler_sl },
{ NCSI_PKT_CMD_GLS, 0, ncsi_cmd_handler_default }, { NCSI_PKT_CMD_GLS, 0, ncsi_cmd_handler_default },
{ NCSI_PKT_CMD_SVF, 4, ncsi_cmd_handler_svf }, { NCSI_PKT_CMD_SVF, 8, ncsi_cmd_handler_svf },
{ NCSI_PKT_CMD_EV, 4, ncsi_cmd_handler_ev }, { NCSI_PKT_CMD_EV, 4, ncsi_cmd_handler_ev },
{ NCSI_PKT_CMD_DV, 0, ncsi_cmd_handler_default }, { NCSI_PKT_CMD_DV, 0, ncsi_cmd_handler_default },
{ NCSI_PKT_CMD_SMA, 8, ncsi_cmd_handler_sma }, { NCSI_PKT_CMD_SMA, 8, ncsi_cmd_handler_sma },
......
This diff is collapsed.
...@@ -104,7 +104,7 @@ struct ncsi_cmd_svf_pkt { ...@@ -104,7 +104,7 @@ struct ncsi_cmd_svf_pkt {
unsigned char index; /* VLAN table index */ unsigned char index; /* VLAN table index */
unsigned char enable; /* Enable or disable */ unsigned char enable; /* Enable or disable */
__be32 checksum; /* Checksum */ __be32 checksum; /* Checksum */
unsigned char pad[14]; unsigned char pad[18];
}; };
/* Enable VLAN */ /* Enable VLAN */
......
...@@ -354,7 +354,8 @@ static int ncsi_rsp_handler_svf(struct ncsi_request *nr) ...@@ -354,7 +354,8 @@ static int ncsi_rsp_handler_svf(struct ncsi_request *nr)
/* Add or remove the VLAN filter */ /* Add or remove the VLAN filter */
if (!(cmd->enable & 0x1)) { if (!(cmd->enable & 0x1)) {
ret = ncsi_remove_filter(nc, NCSI_FILTER_VLAN, cmd->index); /* HW indexes from 1 */
ret = ncsi_remove_filter(nc, NCSI_FILTER_VLAN, cmd->index - 1);
} else { } else {
vlan = ntohs(cmd->vlan); vlan = ntohs(cmd->vlan);
ret = ncsi_add_filter(nc, NCSI_FILTER_VLAN, &vlan); ret = ncsi_add_filter(nc, NCSI_FILTER_VLAN, &vlan);
...@@ -693,7 +694,14 @@ static int ncsi_rsp_handler_gc(struct ncsi_request *nr) ...@@ -693,7 +694,14 @@ static int ncsi_rsp_handler_gc(struct ncsi_request *nr)
ncf->index = i; ncf->index = i;
ncf->total = cnt; ncf->total = cnt;
if (i == NCSI_FILTER_VLAN) {
/* Set VLAN filters active so they are cleared in
* first configuration state
*/
ncf->bitmap = U64_MAX;
} else {
ncf->bitmap = 0x0ul; ncf->bitmap = 0x0ul;
}
nc->filters[i] = ncf; nc->filters[i] = ncf;
} }
......
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