Commit 3a1e6b84 authored by Ioana Ciocoi Radulescu's avatar Ioana Ciocoi Radulescu Committed by David S. Miller

dpaa2-eth: Update hash key composition code

Introduce an internal id bitfield to uniquely identify header fields
supported by the Rx distribution keys. For the hash key, add a
conversion from the RXH_* bitmask provided by ethtool to the internal
ids.
Signed-off-by: default avatarIoana Radulescu <ruxandra.radulescu@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 61f9bf00
...@@ -2571,10 +2571,12 @@ static const struct dpaa2_eth_dist_fields dist_fields[] = { ...@@ -2571,10 +2571,12 @@ static const struct dpaa2_eth_dist_fields dist_fields[] = {
.rxnfc_field = RXH_L2DA, .rxnfc_field = RXH_L2DA,
.cls_prot = NET_PROT_ETH, .cls_prot = NET_PROT_ETH,
.cls_field = NH_FLD_ETH_DA, .cls_field = NH_FLD_ETH_DA,
.id = DPAA2_ETH_DIST_ETHDST,
.size = 6, .size = 6,
}, { }, {
.cls_prot = NET_PROT_ETH, .cls_prot = NET_PROT_ETH,
.cls_field = NH_FLD_ETH_SA, .cls_field = NH_FLD_ETH_SA,
.id = DPAA2_ETH_DIST_ETHSRC,
.size = 6, .size = 6,
}, { }, {
/* This is the last ethertype field parsed: /* This is the last ethertype field parsed:
...@@ -2583,28 +2585,33 @@ static const struct dpaa2_eth_dist_fields dist_fields[] = { ...@@ -2583,28 +2585,33 @@ static const struct dpaa2_eth_dist_fields dist_fields[] = {
*/ */
.cls_prot = NET_PROT_ETH, .cls_prot = NET_PROT_ETH,
.cls_field = NH_FLD_ETH_TYPE, .cls_field = NH_FLD_ETH_TYPE,
.id = DPAA2_ETH_DIST_ETHTYPE,
.size = 2, .size = 2,
}, { }, {
/* VLAN header */ /* VLAN header */
.rxnfc_field = RXH_VLAN, .rxnfc_field = RXH_VLAN,
.cls_prot = NET_PROT_VLAN, .cls_prot = NET_PROT_VLAN,
.cls_field = NH_FLD_VLAN_TCI, .cls_field = NH_FLD_VLAN_TCI,
.id = DPAA2_ETH_DIST_VLAN,
.size = 2, .size = 2,
}, { }, {
/* IP header */ /* IP header */
.rxnfc_field = RXH_IP_SRC, .rxnfc_field = RXH_IP_SRC,
.cls_prot = NET_PROT_IP, .cls_prot = NET_PROT_IP,
.cls_field = NH_FLD_IP_SRC, .cls_field = NH_FLD_IP_SRC,
.id = DPAA2_ETH_DIST_IPSRC,
.size = 4, .size = 4,
}, { }, {
.rxnfc_field = RXH_IP_DST, .rxnfc_field = RXH_IP_DST,
.cls_prot = NET_PROT_IP, .cls_prot = NET_PROT_IP,
.cls_field = NH_FLD_IP_DST, .cls_field = NH_FLD_IP_DST,
.id = DPAA2_ETH_DIST_IPDST,
.size = 4, .size = 4,
}, { }, {
.rxnfc_field = RXH_L3_PROTO, .rxnfc_field = RXH_L3_PROTO,
.cls_prot = NET_PROT_IP, .cls_prot = NET_PROT_IP,
.cls_field = NH_FLD_IP_PROTO, .cls_field = NH_FLD_IP_PROTO,
.id = DPAA2_ETH_DIST_IPPROTO,
.size = 1, .size = 1,
}, { }, {
/* Using UDP ports, this is functionally equivalent to raw /* Using UDP ports, this is functionally equivalent to raw
...@@ -2613,11 +2620,13 @@ static const struct dpaa2_eth_dist_fields dist_fields[] = { ...@@ -2613,11 +2620,13 @@ static const struct dpaa2_eth_dist_fields dist_fields[] = {
.rxnfc_field = RXH_L4_B_0_1, .rxnfc_field = RXH_L4_B_0_1,
.cls_prot = NET_PROT_UDP, .cls_prot = NET_PROT_UDP,
.cls_field = NH_FLD_UDP_PORT_SRC, .cls_field = NH_FLD_UDP_PORT_SRC,
.id = DPAA2_ETH_DIST_L4SRC,
.size = 2, .size = 2,
}, { }, {
.rxnfc_field = RXH_L4_B_2_3, .rxnfc_field = RXH_L4_B_2_3,
.cls_prot = NET_PROT_UDP, .cls_prot = NET_PROT_UDP,
.cls_field = NH_FLD_UDP_PORT_DST, .cls_field = NH_FLD_UDP_PORT_DST,
.id = DPAA2_ETH_DIST_L4DST,
.size = 2, .size = 2,
}, },
}; };
...@@ -2734,7 +2743,7 @@ static int dpaa2_eth_set_dist_key(struct net_device *net_dev, ...@@ -2734,7 +2743,7 @@ static int dpaa2_eth_set_dist_key(struct net_device *net_dev,
* For Rx flow classification key we set all supported fields * For Rx flow classification key we set all supported fields
*/ */
if (type == DPAA2_ETH_RX_DIST_HASH) { if (type == DPAA2_ETH_RX_DIST_HASH) {
if (!(flags & dist_fields[i].rxnfc_field)) if (!(flags & dist_fields[i].id))
continue; continue;
rx_hash_fields |= dist_fields[i].rxnfc_field; rx_hash_fields |= dist_fields[i].rxnfc_field;
} }
...@@ -2792,11 +2801,17 @@ static int dpaa2_eth_set_dist_key(struct net_device *net_dev, ...@@ -2792,11 +2801,17 @@ static int dpaa2_eth_set_dist_key(struct net_device *net_dev,
int dpaa2_eth_set_hash(struct net_device *net_dev, u64 flags) int dpaa2_eth_set_hash(struct net_device *net_dev, u64 flags)
{ {
struct dpaa2_eth_priv *priv = netdev_priv(net_dev); struct dpaa2_eth_priv *priv = netdev_priv(net_dev);
u64 key = 0;
int i;
if (!dpaa2_eth_hash_enabled(priv)) if (!dpaa2_eth_hash_enabled(priv))
return -EOPNOTSUPP; return -EOPNOTSUPP;
return dpaa2_eth_set_dist_key(net_dev, DPAA2_ETH_RX_DIST_HASH, flags); for (i = 0; i < ARRAY_SIZE(dist_fields); i++)
if (dist_fields[i].rxnfc_field & flags)
key |= dist_fields[i].id;
return dpaa2_eth_set_dist_key(net_dev, DPAA2_ETH_RX_DIST_HASH, key);
} }
static int dpaa2_eth_set_cls(struct dpaa2_eth_priv *priv) static int dpaa2_eth_set_cls(struct dpaa2_eth_priv *priv)
......
...@@ -342,6 +342,7 @@ struct dpaa2_eth_dist_fields { ...@@ -342,6 +342,7 @@ struct dpaa2_eth_dist_fields {
enum net_prot cls_prot; enum net_prot cls_prot;
int cls_field; int cls_field;
int size; int size;
u64 id;
}; };
struct dpaa2_eth_cls_rule { struct dpaa2_eth_cls_rule {
...@@ -455,6 +456,18 @@ enum dpaa2_eth_rx_dist { ...@@ -455,6 +456,18 @@ enum dpaa2_eth_rx_dist {
DPAA2_ETH_RX_DIST_CLS DPAA2_ETH_RX_DIST_CLS
}; };
/* Unique IDs for the supported Rx classification header fields */
#define DPAA2_ETH_DIST_ETHDST BIT(0)
#define DPAA2_ETH_DIST_ETHSRC BIT(1)
#define DPAA2_ETH_DIST_ETHTYPE BIT(2)
#define DPAA2_ETH_DIST_VLAN BIT(3)
#define DPAA2_ETH_DIST_IPSRC BIT(4)
#define DPAA2_ETH_DIST_IPDST BIT(5)
#define DPAA2_ETH_DIST_IPPROTO BIT(6)
#define DPAA2_ETH_DIST_L4SRC BIT(7)
#define DPAA2_ETH_DIST_L4DST BIT(8)
#define DPAA2_ETH_DIST_ALL (~0U)
static inline static inline
unsigned int dpaa2_eth_needed_headroom(struct dpaa2_eth_priv *priv, unsigned int dpaa2_eth_needed_headroom(struct dpaa2_eth_priv *priv,
struct sk_buff *skb) struct sk_buff *skb)
......
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