Commit bc9db417 authored by David S. Miller's avatar David S. Miller

Merge branch 'bcm_sf2-Add-support-for-IPv6-CFP-rules'

Florian Fainelli says:

====================
net: dsa: bcm_sf2: Add support for IPv6 CFP rules

This patch series adds support for matching IPv6 addresses to the existing CFP
support code. Because IPv6 addresses are four times bigger than IPv4, we can
fit them anymore in a single slice, so we need to chain two in order to have
a complete match. This makes us require a second bitmap tracking unique rules
so we don't over populate the TCAM.

Finally, because the code had to be re-organized, it became a lot easier to
support arbitrary prefix/mask lengths, so the last two patches do just that.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 33ad61d0 dd8eff68
...@@ -1067,6 +1067,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev) ...@@ -1067,6 +1067,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
* permanently used * permanently used
*/ */
set_bit(0, priv->cfp.used); set_bit(0, priv->cfp.used);
set_bit(0, priv->cfp.unique);
bcm_sf2_identify_ports(priv, dn->child); bcm_sf2_identify_ports(priv, dn->child);
......
...@@ -54,6 +54,7 @@ struct bcm_sf2_cfp_priv { ...@@ -54,6 +54,7 @@ struct bcm_sf2_cfp_priv {
/* Mutex protecting concurrent accesses to the CFP registers */ /* Mutex protecting concurrent accesses to the CFP registers */
struct mutex lock; struct mutex lock;
DECLARE_BITMAP(used, CFP_NUM_RULES); DECLARE_BITMAP(used, CFP_NUM_RULES);
DECLARE_BITMAP(unique, CFP_NUM_RULES);
unsigned int rules_cnt; unsigned int rules_cnt;
}; };
......
This diff is collapsed.
...@@ -302,14 +302,18 @@ enum bcm_sf2_reg_offs { ...@@ -302,14 +302,18 @@ enum bcm_sf2_reg_offs {
/* UDF_DATA7 */ /* UDF_DATA7 */
#define L3_FRAMING_SHIFT 24 #define L3_FRAMING_SHIFT 24
#define L3_FRAMING_MASK (0x3 << L3_FRAMING_SHIFT) #define L3_FRAMING_MASK (0x3 << L3_FRAMING_SHIFT)
#define IPTOS_SHIFT 16
#define IPTOS_MASK 0xff
#define IPPROTO_SHIFT 8 #define IPPROTO_SHIFT 8
#define IPPROTO_MASK (0xff << IPPROTO_SHIFT) #define IPPROTO_MASK (0xff << IPPROTO_SHIFT)
#define IP_FRAG (1 << 7) #define IP_FRAG_SHIFT 7
#define IP_FRAG (1 << IP_FRAG_SHIFT)
/* UDF_DATA0 */ /* UDF_DATA0 */
#define SLICE_VALID 3 #define SLICE_VALID 3
#define SLICE_NUM_SHIFT 2 #define SLICE_NUM_SHIFT 2
#define SLICE_NUM(x) ((x) << SLICE_NUM_SHIFT) #define SLICE_NUM(x) ((x) << SLICE_NUM_SHIFT)
#define SLICE_NUM_MASK 0x3
#define CORE_CFP_MASK_PORT_0 0x280c0 #define CORE_CFP_MASK_PORT_0 0x280c0
...@@ -405,8 +409,15 @@ enum bcm_sf2_reg_offs { ...@@ -405,8 +409,15 @@ enum bcm_sf2_reg_offs {
#define CFG_UDF_EOL2 (2 << CFG_UDF_OFFSET_BASE_SHIFT) #define CFG_UDF_EOL2 (2 << CFG_UDF_OFFSET_BASE_SHIFT)
#define CFG_UDF_EOL3 (3 << CFG_UDF_OFFSET_BASE_SHIFT) #define CFG_UDF_EOL3 (3 << CFG_UDF_OFFSET_BASE_SHIFT)
/* IPv6 slices */
#define CORE_UDF_0_B_0_8_PORT_0 0x28500
/* IPv6 chained slices */
#define CORE_UDF_0_D_0_11_PORT_0 0x28680
/* Number of slices for IPv4, IPv6 and non-IP */ /* Number of slices for IPv4, IPv6 and non-IP */
#define UDF_NUM_SLICES 9 #define UDF_NUM_SLICES 4
#define UDFS_PER_SLICE 9
/* Spacing between different slices */ /* Spacing between different slices */
#define UDF_SLICE_OFFSET 0x40 #define UDF_SLICE_OFFSET 0x40
......
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