net/sfc/base: add API to inform libefx of hardware removal
[dpdk.git] / drivers / net / sfc / sfc.c
index 37248bc..6690053 100644 (file)
@@ -21,6 +21,7 @@
 #include "sfc_rx.h"
 #include "sfc_tx.h"
 #include "sfc_kvargs.h"
+#include "sfc_tweak.h"
 
 
 int
@@ -829,6 +830,8 @@ sfc_kvarg_fv_variant_handler(__rte_unused const char *key,
                *value = EFX_FW_VARIANT_LOW_LATENCY;
        else if (strcasecmp(value_str, SFC_KVARG_FW_VARIANT_PACKED_STREAM) == 0)
                *value = EFX_FW_VARIANT_PACKED_STREAM;
+       else if (strcasecmp(value_str, SFC_KVARG_FW_VARIANT_DPDK) == 0)
+               *value = EFX_FW_VARIANT_DPDK;
        else
                return -EINVAL;
 
@@ -864,6 +867,10 @@ sfc_get_fw_variant(struct sfc_adapter *sa, efx_fw_variant_t *efv)
                *efv = EFX_FW_VARIANT_PACKED_STREAM;
                break;
 
+       case EFX_RXDP_DPDK_FW_ID:
+               *efv = EFX_FW_VARIANT_DPDK;
+               break;
+
        default:
                /*
                 * Other firmware variants are not considered, since they are
@@ -886,11 +893,39 @@ sfc_fw_variant2str(efx_fw_variant_t efv)
                return SFC_KVARG_FW_VARIANT_LOW_LATENCY;
        case EFX_RXDP_PACKED_STREAM_FW_ID:
                return SFC_KVARG_FW_VARIANT_PACKED_STREAM;
+       case EFX_RXDP_DPDK_FW_ID:
+               return SFC_KVARG_FW_VARIANT_DPDK;
        default:
                return "unknown";
        }
 }
 
+static int
+sfc_kvarg_rxd_wait_timeout_ns(struct sfc_adapter *sa)
+{
+       int rc;
+       long value;
+
+       value = SFC_RXD_WAIT_TIMEOUT_NS_DEF;
+
+       rc = sfc_kvargs_process(sa, SFC_KVARG_RXD_WAIT_TIMEOUT_NS,
+                               sfc_kvarg_long_handler, &value);
+       if (rc != 0)
+               return rc;
+
+       if (value < 0 ||
+           (unsigned long)value > EFX_RXQ_ES_SUPER_BUFFER_HOL_BLOCK_MAX) {
+               sfc_err(sa, "wrong '" SFC_KVARG_RXD_WAIT_TIMEOUT_NS "' "
+                           "was set (%ld);", value);
+               sfc_err(sa, "it must not be less than 0 or greater than %u",
+                           EFX_RXQ_ES_SUPER_BUFFER_HOL_BLOCK_MAX);
+               return EINVAL;
+       }
+
+       sa->rxd_wait_timeout_ns = value;
+       return 0;
+}
+
 static int
 sfc_nic_probe(struct sfc_adapter *sa)
 {
@@ -908,6 +943,10 @@ sfc_nic_probe(struct sfc_adapter *sa)
                return rc;
        }
 
+       rc = sfc_kvarg_rxd_wait_timeout_ns(sa);
+       if (rc != 0)
+               return rc;
+
        rc = efx_nic_probe(enp, preferred_efv);
        if (rc == EACCES) {
                /* Unprivileged functions cannot set FW variant */