X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fenic%2Fenic_res.c;h=a504de5d556fb9619da196e2ced776072f8b305d;hb=fbe90cdd776c3ac99c4c56d1b5318a90fcf01602;hp=9b5baf3ba07fb5e80b1e05de126719d08ddf5b8d;hpb=036c545da18643f6c9e3b4cec81aa91f262f6414;p=dpdk.git diff --git a/drivers/net/enic/enic_res.c b/drivers/net/enic/enic_res.c index 9b5baf3ba0..a504de5d55 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" : @@ -138,26 +141,63 @@ int enic_get_vnic_config(struct enic *enic) enic->hash_key_size = ENIC_RSS_HASH_KEY_SIZE; enic->flow_type_rss_offloads = 0; if (ENIC_SETTING(enic, RSSHASH_IPV4)) - enic->flow_type_rss_offloads |= ETH_RSS_IPV4; + /* + * IPV4 hash type handles both non-frag and frag packet types. + * TCP/UDP is controlled via a separate flag below. + */ + enic->flow_type_rss_offloads |= ETH_RSS_IPV4 | + ETH_RSS_FRAG_IPV4 | ETH_RSS_NONFRAG_IPV4_OTHER; if (ENIC_SETTING(enic, RSSHASH_TCPIPV4)) enic->flow_type_rss_offloads |= ETH_RSS_NONFRAG_IPV4_TCP; if (ENIC_SETTING(enic, RSSHASH_IPV6)) - enic->flow_type_rss_offloads |= ETH_RSS_IPV6; + /* + * The VIC adapter can perform RSS on IPv6 packets with and + * without extension headers. An IPv6 "fragment" is an IPv6 + * packet with the fragment extension header. + */ + enic->flow_type_rss_offloads |= ETH_RSS_IPV6 | + ETH_RSS_IPV6_EX | ETH_RSS_FRAG_IPV6 | + ETH_RSS_NONFRAG_IPV6_OTHER; if (ENIC_SETTING(enic, RSSHASH_TCPIPV6)) - enic->flow_type_rss_offloads |= ETH_RSS_NONFRAG_IPV6_TCP; - if (ENIC_SETTING(enic, RSSHASH_IPV6_EX)) - enic->flow_type_rss_offloads |= ETH_RSS_IPV6_EX; - if (ENIC_SETTING(enic, RSSHASH_TCPIPV6_EX)) - enic->flow_type_rss_offloads |= ETH_RSS_IPV6_TCP_EX; - if (vnic_dev_capable_udp_rss(enic->vdev)) { + enic->flow_type_rss_offloads |= ETH_RSS_NONFRAG_IPV6_TCP | + ETH_RSS_IPV6_TCP_EX; + if (ENIC_SETTING(enic, RSSHASH_UDP_WEAK)) enic->flow_type_rss_offloads |= - ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP; - } + 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)) enic->flow_type_rss_offloads = 0; + enic->vxlan = ENIC_SETTING(enic, VXLAN) && + vnic_dev_capable_vxlan(enic->vdev); + /* + * Default hardware capabilities. enic_dev_init() may add additional + * flags if it enables overlay offloads. + */ + enic->tx_offload_capa = + DEV_TX_OFFLOAD_VLAN_INSERT | + DEV_TX_OFFLOAD_IPV4_CKSUM | + DEV_TX_OFFLOAD_UDP_CKSUM | + DEV_TX_OFFLOAD_TCP_CKSUM | + DEV_TX_OFFLOAD_TCP_TSO; + enic->rx_offload_capa = + DEV_RX_OFFLOAD_VLAN_STRIP | + DEV_RX_OFFLOAD_IPV4_CKSUM | + DEV_RX_OFFLOAD_UDP_CKSUM | + DEV_RX_OFFLOAD_TCP_CKSUM; + enic->tx_offload_mask = + PKT_TX_VLAN_PKT | + PKT_TX_IP_CKSUM | + PKT_TX_L4_MASK | + PKT_TX_TCP_SEG; + return 0; }