|
@@ -2201,7 +2201,7 @@ static int nfp_net_set_config_and_enable(struct nfp_net *nn)
|
|
|
|
|
|
new_ctrl = nn->dp.ctrl;
|
|
|
|
|
|
- if (nn->dp.ctrl & NFP_NET_CFG_CTRL_RSS) {
|
|
|
+ if (nn->dp.ctrl & NFP_NET_CFG_CTRL_RSS_ANY) {
|
|
|
nfp_net_rss_write_key(nn);
|
|
|
nfp_net_rss_write_itbl(nn);
|
|
|
nn_writel(nn, NFP_NET_CFG_RSS_CTRL, nn->rss_cfg);
|
|
@@ -3035,7 +3035,7 @@ void nfp_net_info(struct nfp_net *nn)
|
|
|
nn->fw_ver.resv, nn->fw_ver.class,
|
|
|
nn->fw_ver.major, nn->fw_ver.minor,
|
|
|
nn->max_mtu);
|
|
|
- nn_info(nn, "CAP: %#x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
|
|
|
+ nn_info(nn, "CAP: %#x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
|
|
|
nn->cap,
|
|
|
nn->cap & NFP_NET_CFG_CTRL_PROMISC ? "PROMISC " : "",
|
|
|
nn->cap & NFP_NET_CFG_CTRL_L2BC ? "L2BCFILT " : "",
|
|
@@ -3048,7 +3048,8 @@ void nfp_net_info(struct nfp_net *nn)
|
|
|
nn->cap & NFP_NET_CFG_CTRL_GATHER ? "GATHER " : "",
|
|
|
nn->cap & NFP_NET_CFG_CTRL_LSO ? "TSO1 " : "",
|
|
|
nn->cap & NFP_NET_CFG_CTRL_LSO2 ? "TSO2 " : "",
|
|
|
- nn->cap & NFP_NET_CFG_CTRL_RSS ? "RSS " : "",
|
|
|
+ nn->cap & NFP_NET_CFG_CTRL_RSS ? "RSS1 " : "",
|
|
|
+ nn->cap & NFP_NET_CFG_CTRL_RSS2 ? "RSS2 " : "",
|
|
|
nn->cap & NFP_NET_CFG_CTRL_L2SWITCH ? "L2SWITCH " : "",
|
|
|
nn->cap & NFP_NET_CFG_CTRL_MSIXAUTO ? "AUTOMASK " : "",
|
|
|
nn->cap & NFP_NET_CFG_CTRL_IRQMOD ? "IRQMOD " : "",
|
|
@@ -3202,14 +3203,18 @@ int nfp_net_netdev_init(struct net_device *netdev)
|
|
|
struct nfp_net *nn = netdev_priv(netdev);
|
|
|
int err;
|
|
|
|
|
|
- nn->dp.chained_metadata_format = nn->fw_ver.major > 3;
|
|
|
-
|
|
|
nn->dp.rx_dma_dir = DMA_FROM_DEVICE;
|
|
|
|
|
|
/* Get some of the read-only fields from the BAR */
|
|
|
nn->cap = nn_readl(nn, NFP_NET_CFG_CAP);
|
|
|
nn->max_mtu = nn_readl(nn, NFP_NET_CFG_MAX_MTU);
|
|
|
|
|
|
+ /* Chained metadata is signalled by capabilities except in version 4 */
|
|
|
+ nn->dp.chained_metadata_format = nn->fw_ver.major == 4 ||
|
|
|
+ nn->cap & NFP_NET_CFG_CTRL_CHAIN_META;
|
|
|
+ if (nn->dp.chained_metadata_format && nn->fw_ver.major != 4)
|
|
|
+ nn->cap &= ~NFP_NET_CFG_CTRL_RSS;
|
|
|
+
|
|
|
nfp_net_write_mac_addr(nn);
|
|
|
|
|
|
/* Determine RX packet/metadata boundary offset */
|
|
@@ -3259,10 +3264,11 @@ int nfp_net_netdev_init(struct net_device *netdev)
|
|
|
nn->dp.ctrl |= nn->cap & NFP_NET_CFG_CTRL_LSO2 ?:
|
|
|
NFP_NET_CFG_CTRL_LSO;
|
|
|
}
|
|
|
- if (nn->cap & NFP_NET_CFG_CTRL_RSS) {
|
|
|
+ if (nn->cap & NFP_NET_CFG_CTRL_RSS_ANY) {
|
|
|
netdev->hw_features |= NETIF_F_RXHASH;
|
|
|
nfp_net_rss_init(nn);
|
|
|
- nn->dp.ctrl |= NFP_NET_CFG_CTRL_RSS;
|
|
|
+ nn->dp.ctrl |= nn->cap & NFP_NET_CFG_CTRL_RSS2 ?:
|
|
|
+ NFP_NET_CFG_CTRL_RSS;
|
|
|
}
|
|
|
if (nn->cap & NFP_NET_CFG_CTRL_VXLAN &&
|
|
|
nn->cap & NFP_NET_CFG_CTRL_NVGRE) {
|