Commit 5882d526 authored by David S. Miller's avatar David S. Miller

Merge branch 'net-dsa-bcm_sf2-Store-rules-in-lists'

Florian Fainelli says:

====================
net: dsa: bcm_sf2: Store rules in lists

This patch series changes the bcm-sf2 driver to keep a copy of the
inserted rules as opposed to using the HW as a storage area for a number
of reasons:

- this helps us with doing duplicate rule detection in a faster way, it
  would have required a full rule read before

- this helps with Pablo's on-going work to convert ethtool_rx_flow_spec
  to a more generic flow rule structure by having fewer code paths to
  convert to the new structure/helpers

- we need to cache copies to restore them during drive resumption,
  because depending on the low power mode the system has entered, the
  switch may have lost all of its context
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 95772ec9 80f8dea8
...@@ -710,6 +710,10 @@ static int bcm_sf2_sw_resume(struct dsa_switch *ds) ...@@ -710,6 +710,10 @@ static int bcm_sf2_sw_resume(struct dsa_switch *ds)
return ret; return ret;
} }
ret = bcm_sf2_cfp_resume(ds);
if (ret)
return ret;
if (priv->hw_params.num_gphy == 1) if (priv->hw_params.num_gphy == 1)
bcm_sf2_gphy_enable_set(ds, true); bcm_sf2_gphy_enable_set(ds, true);
...@@ -1061,6 +1065,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev) ...@@ -1061,6 +1065,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
spin_lock_init(&priv->indir_lock); spin_lock_init(&priv->indir_lock);
mutex_init(&priv->stats_mutex); mutex_init(&priv->stats_mutex);
mutex_init(&priv->cfp.lock); mutex_init(&priv->cfp.lock);
INIT_LIST_HEAD(&priv->cfp.rules_list);
/* CFP rule #0 cannot be used for specific classifications, flag it as /* CFP rule #0 cannot be used for specific classifications, flag it as
* permanently used * permanently used
...@@ -1166,6 +1171,7 @@ static int bcm_sf2_sw_remove(struct platform_device *pdev) ...@@ -1166,6 +1171,7 @@ static int bcm_sf2_sw_remove(struct platform_device *pdev)
priv->wol_ports_mask = 0; priv->wol_ports_mask = 0;
dsa_unregister_switch(priv->dev->ds); dsa_unregister_switch(priv->dev->ds);
bcm_sf2_cfp_exit(priv->dev->ds);
/* Disable all ports and interrupts */ /* Disable all ports and interrupts */
bcm_sf2_sw_suspend(priv->dev->ds); bcm_sf2_sw_suspend(priv->dev->ds);
bcm_sf2_mdio_unregister(priv); bcm_sf2_mdio_unregister(priv);
......
...@@ -56,6 +56,7 @@ struct bcm_sf2_cfp_priv { ...@@ -56,6 +56,7 @@ struct bcm_sf2_cfp_priv {
DECLARE_BITMAP(used, CFP_NUM_RULES); DECLARE_BITMAP(used, CFP_NUM_RULES);
DECLARE_BITMAP(unique, CFP_NUM_RULES); DECLARE_BITMAP(unique, CFP_NUM_RULES);
unsigned int rules_cnt; unsigned int rules_cnt;
struct list_head rules_list;
}; };
struct bcm_sf2_priv { struct bcm_sf2_priv {
...@@ -213,5 +214,7 @@ int bcm_sf2_get_rxnfc(struct dsa_switch *ds, int port, ...@@ -213,5 +214,7 @@ int bcm_sf2_get_rxnfc(struct dsa_switch *ds, int port,
int bcm_sf2_set_rxnfc(struct dsa_switch *ds, int port, int bcm_sf2_set_rxnfc(struct dsa_switch *ds, int port,
struct ethtool_rxnfc *nfc); struct ethtool_rxnfc *nfc);
int bcm_sf2_cfp_rst(struct bcm_sf2_priv *priv); int bcm_sf2_cfp_rst(struct bcm_sf2_priv *priv);
void bcm_sf2_cfp_exit(struct dsa_switch *ds);
int bcm_sf2_cfp_resume(struct dsa_switch *ds);
#endif /* __BCM_SF2_H */ #endif /* __BCM_SF2_H */
This diff is collapsed.
...@@ -1068,6 +1068,7 @@ static void mpd_enable_set(struct bcm_sysport_priv *priv, bool enable) ...@@ -1068,6 +1068,7 @@ static void mpd_enable_set(struct bcm_sysport_priv *priv, bool enable)
static void bcm_sysport_resume_from_wol(struct bcm_sysport_priv *priv) static void bcm_sysport_resume_from_wol(struct bcm_sysport_priv *priv)
{ {
unsigned int index;
u32 reg; u32 reg;
/* Disable RXCHK, active filters and Broadcom tag matching */ /* Disable RXCHK, active filters and Broadcom tag matching */
...@@ -1076,6 +1077,15 @@ static void bcm_sysport_resume_from_wol(struct bcm_sysport_priv *priv) ...@@ -1076,6 +1077,15 @@ static void bcm_sysport_resume_from_wol(struct bcm_sysport_priv *priv)
RXCHK_BRCM_TAG_MATCH_SHIFT | RXCHK_EN | RXCHK_BRCM_TAG_EN); RXCHK_BRCM_TAG_MATCH_SHIFT | RXCHK_EN | RXCHK_BRCM_TAG_EN);
rxchk_writel(priv, reg, RXCHK_CONTROL); rxchk_writel(priv, reg, RXCHK_CONTROL);
/* Make sure we restore correct CID index in case HW lost
* its context during deep idle state
*/
for_each_set_bit(index, priv->filters, RXCHK_BRCM_TAG_MAX) {
rxchk_writel(priv, priv->filters_loc[index] <<
RXCHK_BRCM_TAG_CID_SHIFT, RXCHK_BRCM_TAG(index));
rxchk_writel(priv, 0xff00ffff, RXCHK_BRCM_TAG_MASK(index));
}
/* Clear the MagicPacket detection logic */ /* Clear the MagicPacket detection logic */
mpd_enable_set(priv, false); mpd_enable_set(priv, false);
...@@ -2189,6 +2199,7 @@ static int bcm_sysport_rule_set(struct bcm_sysport_priv *priv, ...@@ -2189,6 +2199,7 @@ static int bcm_sysport_rule_set(struct bcm_sysport_priv *priv,
rxchk_writel(priv, reg, RXCHK_BRCM_TAG(index)); rxchk_writel(priv, reg, RXCHK_BRCM_TAG(index));
rxchk_writel(priv, 0xff00ffff, RXCHK_BRCM_TAG_MASK(index)); rxchk_writel(priv, 0xff00ffff, RXCHK_BRCM_TAG_MASK(index));
priv->filters_loc[index] = nfc->fs.location;
set_bit(index, priv->filters); set_bit(index, priv->filters);
return 0; return 0;
...@@ -2208,6 +2219,7 @@ static int bcm_sysport_rule_del(struct bcm_sysport_priv *priv, ...@@ -2208,6 +2219,7 @@ static int bcm_sysport_rule_del(struct bcm_sysport_priv *priv,
* be taken care of during suspend time by bcm_sysport_suspend_to_wol * be taken care of during suspend time by bcm_sysport_suspend_to_wol
*/ */
clear_bit(index, priv->filters); clear_bit(index, priv->filters);
priv->filters_loc[index] = 0;
return 0; return 0;
} }
......
...@@ -786,6 +786,7 @@ struct bcm_sysport_priv { ...@@ -786,6 +786,7 @@ struct bcm_sysport_priv {
/* Ethtool */ /* Ethtool */
u32 msg_enable; u32 msg_enable;
DECLARE_BITMAP(filters, RXCHK_BRCM_TAG_MAX); DECLARE_BITMAP(filters, RXCHK_BRCM_TAG_MAX);
u32 filters_loc[RXCHK_BRCM_TAG_MAX];
struct bcm_sysport_stats64 stats64; struct bcm_sysport_stats64 stats64;
......
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