From: Hyong Youb Kim <hyon...@cisco.com> Current adapters which support UDP RSS piggyback on TCP RSS. Change the controls to be forward compatible with future adapters, which will have independent control of UDP and TCP.
Fixes: 9bd04182bb01 ("net/enic: support UDP RSS on 1400 series adapters") Signed-off-by: John Daley <johnd...@cisco.com> Reviewed-by: Hyong Youb Kim <hyon...@cisco.com> Reviewed-by: Aaron Conole <acon...@redhat.com> --- drivers/net/enic/base/vnic_dev.c | 17 ----------------- drivers/net/enic/base/vnic_dev.h | 1 - drivers/net/enic/base/vnic_enet.h | 4 ++++ drivers/net/enic/base/vnic_nic.h | 3 ++- drivers/net/enic/enic_main.c | 20 ++++++++++++-------- drivers/net/enic/enic_res.c | 13 ++++++++++--- 6 files changed, 28 insertions(+), 30 deletions(-) diff --git a/drivers/net/enic/base/vnic_dev.c b/drivers/net/enic/base/vnic_dev.c index 8880ab981..8483f76f3 100644 --- a/drivers/net/enic/base/vnic_dev.c +++ b/drivers/net/enic/base/vnic_dev.c @@ -528,23 +528,6 @@ int vnic_dev_capable_filter_mode(struct vnic_dev *vdev, u32 *mode, return 0; } -int vnic_dev_capable_udp_rss(struct vnic_dev *vdev) -{ - u64 a0 = CMD_NIC_CFG, a1 = 0; - u64 rss_hash_type; - int wait = 1000; - int err; - - err = vnic_dev_cmd(vdev, CMD_CAPABILITY, &a0, &a1, wait); - if (err) - return 0; - if (a0 == 0) - return 0; - rss_hash_type = (a1 >> NIC_CFG_RSS_HASH_TYPE_SHIFT) & - NIC_CFG_RSS_HASH_TYPE_MASK_FIELD; - return ((rss_hash_type & NIC_CFG_RSS_HASH_TYPE_UDP) ? 1 : 0); -} - int vnic_dev_capable(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd) { u64 a0 = (u32)cmd, a1 = 0; diff --git a/drivers/net/enic/base/vnic_dev.h b/drivers/net/enic/base/vnic_dev.h index e7a1f8bd8..3c9084304 100644 --- a/drivers/net/enic/base/vnic_dev.h +++ b/drivers/net/enic/base/vnic_dev.h @@ -109,7 +109,6 @@ int vnic_dev_capable_adv_filters(struct vnic_dev *vdev); int vnic_dev_capable(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd); int vnic_dev_capable_filter_mode(struct vnic_dev *vdev, u32 *mode, u8 *filter_actions); -int vnic_dev_capable_udp_rss(struct vnic_dev *vdev); int vnic_dev_asic_info(struct vnic_dev *vdev, u16 *asic_type, u16 *asic_rev); int vnic_dev_spec(struct vnic_dev *vdev, unsigned int offset, size_t size, void *value); diff --git a/drivers/net/enic/base/vnic_enet.h b/drivers/net/enic/base/vnic_enet.h index 26918335f..49504a7da 100644 --- a/drivers/net/enic/base/vnic_enet.h +++ b/drivers/net/enic/base/vnic_enet.h @@ -52,6 +52,10 @@ struct vnic_enet_config { #define VENETF_VXLAN 0x10000 /* VxLAN offload */ #define VENETF_NVGRE 0x20000 /* NVGRE offload */ #define VENETF_GRPINTR 0x40000 /* group interrupt */ +#define VENETF_NICSWITCH 0x80000 /* NICSWITCH enabled */ +#define VENETF_RSSHASH_UDP_WEAK 0x100000 /* VIC has Bodega-style UDP RSS */ +#define VENETF_RSSHASH_UDPIPV4 0x200000 /* Hash on UDP + IPv4 fields */ +#define VENETF_RSSHASH_UDPIPV6 0x400000 /* Hash on UDP + IPv6 fields */ #define VENET_INTR_TYPE_MIN 0 /* Timer specs min interrupt spacing */ #define VENET_INTR_TYPE_IDLE 1 /* Timer specs idle time before irq */ diff --git a/drivers/net/enic/base/vnic_nic.h b/drivers/net/enic/base/vnic_nic.h index b20915e76..e318d0cb5 100644 --- a/drivers/net/enic/base/vnic_nic.h +++ b/drivers/net/enic/base/vnic_nic.h @@ -27,13 +27,14 @@ #define NIC_CFG_IG_VLAN_STRIP_EN_MASK_FIELD 1UL #define NIC_CFG_IG_VLAN_STRIP_EN_SHIFT 24 +#define NIC_CFG_RSS_HASH_TYPE_UDP_IPV4 (1 << 0) #define NIC_CFG_RSS_HASH_TYPE_IPV4 (1 << 1) #define NIC_CFG_RSS_HASH_TYPE_TCP_IPV4 (1 << 2) #define NIC_CFG_RSS_HASH_TYPE_IPV6 (1 << 3) #define NIC_CFG_RSS_HASH_TYPE_TCP_IPV6 (1 << 4) #define NIC_CFG_RSS_HASH_TYPE_IPV6_EX (1 << 5) #define NIC_CFG_RSS_HASH_TYPE_TCP_IPV6_EX (1 << 6) -#define NIC_CFG_RSS_HASH_TYPE_UDP (1 << 7) +#define NIC_CFG_RSS_HASH_TYPE_UDP_IPV6 (1 << 7) static inline void vnic_set_nic_cfg(u32 *nic_cfg, u8 rss_default_cpu, u8 rss_hash_type, diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c index 2b1c1347c..a25d303de 100644 --- a/drivers/net/enic/enic_main.c +++ b/drivers/net/enic/enic_main.c @@ -1196,12 +1196,15 @@ int enic_set_rss_conf(struct enic *enic, struct rte_eth_rss_conf *rss_conf) if (rss_hf & ETH_RSS_NONFRAG_IPV4_TCP) rss_hash_type |= NIC_CFG_RSS_HASH_TYPE_TCP_IPV4; if (rss_hf & ETH_RSS_NONFRAG_IPV4_UDP) { - /* - * 'TCP' is not a typo. HW does not have a separate - * enable bit for UDP RSS. The TCP bit enables both TCP - * and UDP RSS.. - */ - rss_hash_type |= NIC_CFG_RSS_HASH_TYPE_TCP_IPV4; + rss_hash_type |= NIC_CFG_RSS_HASH_TYPE_UDP_IPV4; + if (ENIC_SETTING(enic, RSSHASH_UDP_WEAK)) { + /* + * 'TCP' is not a typo. The "weak" version of + * UDP RSS requires both the TCP and UDP bits + * be set. It does enable TCP RSS as well. + */ + rss_hash_type |= NIC_CFG_RSS_HASH_TYPE_TCP_IPV4; + } } if (rss_hf & (ETH_RSS_IPV6 | ETH_RSS_IPV6_EX | ETH_RSS_FRAG_IPV6 | ETH_RSS_NONFRAG_IPV6_OTHER)) @@ -1209,8 +1212,9 @@ int enic_set_rss_conf(struct enic *enic, struct rte_eth_rss_conf *rss_conf) if (rss_hf & (ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_IPV6_TCP_EX)) rss_hash_type |= NIC_CFG_RSS_HASH_TYPE_TCP_IPV6; if (rss_hf & (ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_IPV6_UDP_EX)) { - /* Again, 'TCP' is not a typo. */ - rss_hash_type |= NIC_CFG_RSS_HASH_TYPE_TCP_IPV6; + rss_hash_type |= NIC_CFG_RSS_HASH_TYPE_UDP_IPV6; + if (ENIC_SETTING(enic, RSSHASH_UDP_WEAK)) + rss_hash_type |= NIC_CFG_RSS_HASH_TYPE_TCP_IPV6; } } else { rss_enable = 0; diff --git a/drivers/net/enic/enic_res.c b/drivers/net/enic/enic_res.c index bdda2c564..a504de5d5 100644 --- a/drivers/net/enic/enic_res.c +++ b/drivers/net/enic/enic_res.c @@ -122,7 +122,10 @@ int enic_get_vnic_config(struct enic *enic) "loopback tag 0x%04x\n", ENIC_SETTING(enic, TXCSUM) ? "yes" : "no", ENIC_SETTING(enic, RXCSUM) ? "yes" : "no", - ENIC_SETTING(enic, RSS) ? "yes" : "no", + ENIC_SETTING(enic, RSS) ? + (ENIC_SETTING(enic, RSSHASH_UDPIPV4) ? "+UDP" : + ((ENIC_SETTING(enic, RSSHASH_UDP_WEAK) ? "+udp" : + "yes"))) : "no", c->intr_mode == VENET_INTR_MODE_INTX ? "INTx" : c->intr_mode == VENET_INTR_MODE_MSI ? "MSI" : c->intr_mode == VENET_INTR_MODE_ANY ? "any" : @@ -158,11 +161,15 @@ int enic_get_vnic_config(struct enic *enic) if (ENIC_SETTING(enic, RSSHASH_TCPIPV6)) enic->flow_type_rss_offloads |= ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_IPV6_TCP_EX; - if (vnic_dev_capable_udp_rss(enic->vdev)) { + if (ENIC_SETTING(enic, RSSHASH_UDP_WEAK)) enic->flow_type_rss_offloads |= ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_IPV6_UDP_EX; - } + if (ENIC_SETTING(enic, RSSHASH_UDPIPV4)) + enic->flow_type_rss_offloads |= ETH_RSS_NONFRAG_IPV4_UDP; + if (ENIC_SETTING(enic, RSSHASH_UDPIPV6)) + enic->flow_type_rss_offloads |= ETH_RSS_NONFRAG_IPV6_UDP | + ETH_RSS_IPV6_UDP_EX; /* Zero offloads if RSS is not enabled */ if (!ENIC_SETTING(enic, RSS)) -- 2.16.2