net/sfc: use zero RSS channels as disabled RSS indicator
authorAndrew Rybchenko <arybchenko@solarflare.com>
Tue, 18 Apr 2017 13:03:07 +0000 (14:03 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 19 Apr 2017 13:37:37 +0000 (15:37 +0200)
Enabled RSS enables RSS hash computation and provision in pseudo header.
It still makes sense for applications even if only one Rx queue is used.

Fixes: 4ec1fc3ba881 ("net/sfc: add basic stubs for RSS support on driver attach")
Fixes: 088e17210a7a ("net/sfc: query RSS key and hash types config")
Fixes: 82faef507608 ("net/sfc: set RSS key and hash types config")
Fixes: af0d9317970c ("net/sfc: query RSS redirection table")
Fixes: 32bcfb0a50b1 ("net/sfc: update RSS redirection table")
Fixes: f5258439ee5d ("net/sfc: avoid failure on port start if Rx mode is rejected")

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@solarflare.com>
drivers/net/sfc/sfc_ethdev.c
drivers/net/sfc/sfc_rx.c

index 7620080..4c9335f 100644 (file)
@@ -1084,10 +1084,12 @@ sfc_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
 {
        struct sfc_adapter *sa = dev->data->dev_private;
 
-       if ((sa->rss_channels == 1) ||
-           (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE))
+       if (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE)
                return -ENOTSUP;
 
+       if (sa->rss_channels == 0)
+               return -EINVAL;
+
        sfc_adapter_lock(sa);
 
        /*
@@ -1114,12 +1116,16 @@ sfc_dev_rss_hash_update(struct rte_eth_dev *dev,
        unsigned int efx_hash_types;
        int rc = 0;
 
-       if ((sa->rss_channels == 1) ||
-           (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE)) {
+       if (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE) {
                sfc_err(sa, "RSS is not available");
                return -ENOTSUP;
        }
 
+       if (sa->rss_channels == 0) {
+               sfc_err(sa, "RSS is not configured");
+               return -EINVAL;
+       }
+
        if ((rss_conf->rss_key != NULL) &&
            (rss_conf->rss_key_len != sizeof(sa->rss_key))) {
                sfc_err(sa, "RSS key size is wrong (should be %lu)",
@@ -1176,10 +1182,12 @@ sfc_dev_rss_reta_query(struct rte_eth_dev *dev,
        struct sfc_adapter *sa = dev->data->dev_private;
        int entry;
 
-       if ((sa->rss_channels == 1) ||
-           (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE))
+       if (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE)
                return -ENOTSUP;
 
+       if (sa->rss_channels == 0)
+               return -EINVAL;
+
        if (reta_size != EFX_RSS_TBL_SIZE)
                return -EINVAL;
 
@@ -1209,12 +1217,16 @@ sfc_dev_rss_reta_update(struct rte_eth_dev *dev,
        int rc;
 
 
-       if ((sa->rss_channels == 1) ||
-           (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE)) {
+       if (sa->rss_support != EFX_RX_SCALE_EXCLUSIVE) {
                sfc_err(sa, "RSS is not available");
                return -ENOTSUP;
        }
 
+       if (sa->rss_channels == 0) {
+               sfc_err(sa, "RSS is not configured");
+               return -EINVAL;
+       }
+
        if (reta_size != EFX_RSS_TBL_SIZE) {
                sfc_err(sa, "RETA size is wrong (should be %u)",
                        EFX_RSS_TBL_SIZE);
index 9f512d9..664b38d 100644 (file)
@@ -577,7 +577,7 @@ sfc_rx_qflush(struct sfc_adapter *sa, unsigned int sw_index)
 static int
 sfc_rx_default_rxq_set_filter(struct sfc_adapter *sa, struct sfc_rxq *rxq)
 {
-       boolean_t rss = (sa->rss_channels > 1) ? B_TRUE : B_FALSE;
+       boolean_t rss = (sa->rss_channels > 0) ? B_TRUE : B_FALSE;
        struct sfc_port *port = &sa->port;
        int rc;
 
@@ -1052,7 +1052,7 @@ sfc_rx_rss_config(struct sfc_adapter *sa)
        int rc = 0;
 
 #if EFSYS_OPT_RX_SCALE
-       if (sa->rss_channels > 1) {
+       if (sa->rss_channels > 0) {
                rc = efx_rx_scale_mode_set(sa->nic, EFX_RX_HASHALG_TOEPLITZ,
                                           sa->rss_hash_types, B_TRUE);
                if (rc != 0)
@@ -1289,9 +1289,9 @@ sfc_rx_configure(struct sfc_adapter *sa)
 
 #if EFSYS_OPT_RX_SCALE
        sa->rss_channels = (dev_conf->rxmode.mq_mode == ETH_MQ_RX_RSS) ?
-                          MIN(sa->rxq_count, EFX_MAXRSS) : 1;
+                          MIN(sa->rxq_count, EFX_MAXRSS) : 0;
 
-       if (sa->rss_channels > 1) {
+       if (sa->rss_channels > 0) {
                for (sw_index = 0; sw_index < EFX_RSS_TBL_SIZE; ++sw_index)
                        sa->rss_tbl[sw_index] = sw_index % sa->rss_channels;
        }