New upstream version 18.11-rc1
[deb_dpdk.git] / drivers / net / sfc / base / ef10_rx.c
index 313a369..3c8f4f3 100644 (file)
@@ -29,8 +29,8 @@ efx_mcdi_init_rxq(
 {
        efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
        efx_mcdi_req_t req;
-       uint8_t payload[MAX(MC_CMD_INIT_RXQ_V3_IN_LEN,
-                           MC_CMD_INIT_RXQ_V3_OUT_LEN)];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_INIT_RXQ_V3_IN_LEN,
+               MC_CMD_INIT_RXQ_V3_OUT_LEN);
        int npages = EFX_RXQ_NBUFS(ndescs);
        int i;
        efx_qword_t *dma_addr;
@@ -73,7 +73,6 @@ efx_mcdi_init_rxq(
                want_outer_classes = B_FALSE;
        }
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_INIT_RXQ;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_INIT_RXQ_V3_IN_LEN;
@@ -146,11 +145,10 @@ efx_mcdi_fini_rxq(
        __in            uint32_t instance)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MAX(MC_CMD_FINI_RXQ_IN_LEN,
-                           MC_CMD_FINI_RXQ_OUT_LEN)];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_FINI_RXQ_IN_LEN,
+               MC_CMD_FINI_RXQ_OUT_LEN);
        efx_rc_t rc;
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_FINI_RXQ;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_FINI_RXQ_IN_LEN;
@@ -188,8 +186,8 @@ efx_mcdi_rss_context_alloc(
        __out           uint32_t *rss_contextp)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MAX(MC_CMD_RSS_CONTEXT_ALLOC_IN_LEN,
-                           MC_CMD_RSS_CONTEXT_ALLOC_OUT_LEN)];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_RSS_CONTEXT_ALLOC_IN_LEN,
+               MC_CMD_RSS_CONTEXT_ALLOC_OUT_LEN);
        uint32_t rss_context;
        uint32_t context_type;
        efx_rc_t rc;
@@ -211,7 +209,6 @@ efx_mcdi_rss_context_alloc(
                goto fail2;
        }
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_RSS_CONTEXT_ALLOC;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_RSS_CONTEXT_ALLOC_IN_LEN;
@@ -274,8 +271,8 @@ efx_mcdi_rss_context_free(
        __in            uint32_t rss_context)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MAX(MC_CMD_RSS_CONTEXT_FREE_IN_LEN,
-                           MC_CMD_RSS_CONTEXT_FREE_OUT_LEN)];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_RSS_CONTEXT_FREE_IN_LEN,
+               MC_CMD_RSS_CONTEXT_FREE_OUT_LEN);
        efx_rc_t rc;
 
        if (rss_context == EF10_RSS_CONTEXT_INVALID) {
@@ -283,7 +280,6 @@ efx_mcdi_rss_context_free(
                goto fail1;
        }
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_RSS_CONTEXT_FREE;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_RSS_CONTEXT_FREE_IN_LEN;
@@ -318,14 +314,9 @@ efx_mcdi_rss_context_set_flags(
        __in            efx_rx_hash_type_t type)
 {
        efx_nic_cfg_t *encp = &enp->en_nic_cfg;
-       efx_rx_hash_type_t type_ipv4;
-       efx_rx_hash_type_t type_ipv4_tcp;
-       efx_rx_hash_type_t type_ipv6;
-       efx_rx_hash_type_t type_ipv6_tcp;
-       efx_rx_hash_type_t modes;
        efx_mcdi_req_t req;
-       uint8_t payload[MAX(MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_LEN,
-                           MC_CMD_RSS_CONTEXT_SET_FLAGS_OUT_LEN)];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_LEN,
+               MC_CMD_RSS_CONTEXT_SET_FLAGS_OUT_LEN);
        efx_rc_t rc;
 
        EFX_STATIC_ASSERT(EFX_RX_CLASS_IPV4_TCP_LBN ==
@@ -350,7 +341,6 @@ efx_mcdi_rss_context_set_flags(
                goto fail1;
        }
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_RSS_CONTEXT_SET_FLAGS;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_RSS_CONTEXT_SET_FLAGS_IN_LEN;
@@ -360,57 +350,38 @@ efx_mcdi_rss_context_set_flags(
        MCDI_IN_SET_DWORD(req, RSS_CONTEXT_SET_FLAGS_IN_RSS_CONTEXT_ID,
            rss_context);
 
-       type_ipv4 = EFX_RX_HASH(IPV4, 2TUPLE) | EFX_RX_HASH(IPV4_TCP, 2TUPLE) |
-                   EFX_RX_HASH(IPV4_UDP, 2TUPLE);
-       type_ipv4_tcp = EFX_RX_HASH(IPV4_TCP, 4TUPLE);
-       type_ipv6 = EFX_RX_HASH(IPV6, 2TUPLE) | EFX_RX_HASH(IPV6_TCP, 2TUPLE) |
-                   EFX_RX_HASH(IPV6_UDP, 2TUPLE);
-       type_ipv6_tcp = EFX_RX_HASH(IPV6_TCP, 4TUPLE);
-
-       /*
-        * Create a copy of the original hash type.
-        * The copy will be used to fill in RSS_MODE bits and
-        * may be cleared beforehand. The original variable
-        * and, thus, EN bits will remain unaffected.
-        */
-       modes = type;
-
        /*
         * If the firmware lacks support for additional modes, RSS_MODE
         * fields must contain zeros, otherwise the operation will fail.
         */
        if (encp->enc_rx_scale_additional_modes_supported == B_FALSE)
-               modes = 0;
-
-#define        EXTRACT_RSS_MODE(_type, _class)         \
-       (EFX_EXTRACT_NATIVE(_type, 0, 31,       \
-       EFX_LOW_BIT(EFX_RX_CLASS_##_class),     \
-       EFX_HIGH_BIT(EFX_RX_CLASS_##_class)) &  \
-       EFX_MASK32(EFX_RX_CLASS_##_class))
+               type &= EFX_RX_HASH_LEGACY_MASK;
 
        MCDI_IN_POPULATE_DWORD_10(req, RSS_CONTEXT_SET_FLAGS_IN_FLAGS,
            RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV4_EN,
-           ((type & type_ipv4) == type_ipv4) ? 1 : 0,
+           (type & EFX_RX_HASH_IPV4) ? 1 : 0,
            RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV4_EN,
-           ((type & type_ipv4_tcp) == type_ipv4_tcp) ? 1 : 0,
+           (type & EFX_RX_HASH_TCPIPV4) ? 1 : 0,
            RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_IPV6_EN,
-           ((type & type_ipv6) == type_ipv6) ? 1 : 0,
+           (type & EFX_RX_HASH_IPV6) ? 1 : 0,
            RSS_CONTEXT_SET_FLAGS_IN_TOEPLITZ_TCPV6_EN,
-           ((type & type_ipv6_tcp) == type_ipv6_tcp) ? 1 : 0,
+           (type & EFX_RX_HASH_TCPIPV6) ? 1 : 0,
            RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV4_RSS_MODE,
-           EXTRACT_RSS_MODE(modes, IPV4_TCP),
+           (type >> EFX_RX_CLASS_IPV4_TCP_LBN) &
+           EFX_MASK32(EFX_RX_CLASS_IPV4_TCP),
            RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV4_RSS_MODE,
-           EXTRACT_RSS_MODE(modes, IPV4_UDP),
+           (type >> EFX_RX_CLASS_IPV4_UDP_LBN) &
+           EFX_MASK32(EFX_RX_CLASS_IPV4_UDP),
            RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV4_RSS_MODE,
-           EXTRACT_RSS_MODE(modes, IPV4),
+           (type >> EFX_RX_CLASS_IPV4_LBN) & EFX_MASK32(EFX_RX_CLASS_IPV4),
            RSS_CONTEXT_SET_FLAGS_IN_TCP_IPV6_RSS_MODE,
-           EXTRACT_RSS_MODE(modes, IPV6_TCP),
+           (type >> EFX_RX_CLASS_IPV6_TCP_LBN) &
+           EFX_MASK32(EFX_RX_CLASS_IPV6_TCP),
            RSS_CONTEXT_SET_FLAGS_IN_UDP_IPV6_RSS_MODE,
-           EXTRACT_RSS_MODE(modes, IPV6_UDP),
+           (type >> EFX_RX_CLASS_IPV6_UDP_LBN) &
+           EFX_MASK32(EFX_RX_CLASS_IPV6_UDP),
            RSS_CONTEXT_SET_FLAGS_IN_OTHER_IPV6_RSS_MODE,
-           EXTRACT_RSS_MODE(modes, IPV6));
-
-#undef EXTRACT_RSS_MODE
+           (type >> EFX_RX_CLASS_IPV6_LBN) & EFX_MASK32(EFX_RX_CLASS_IPV6));
 
        efx_mcdi_execute(enp, &req);
 
@@ -439,8 +410,8 @@ efx_mcdi_rss_context_set_key(
        __in            size_t n)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MAX(MC_CMD_RSS_CONTEXT_SET_KEY_IN_LEN,
-                           MC_CMD_RSS_CONTEXT_SET_KEY_OUT_LEN)];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_RSS_CONTEXT_SET_KEY_IN_LEN,
+               MC_CMD_RSS_CONTEXT_SET_KEY_OUT_LEN);
        efx_rc_t rc;
 
        if (rss_context == EF10_RSS_CONTEXT_INVALID) {
@@ -448,7 +419,6 @@ efx_mcdi_rss_context_set_key(
                goto fail1;
        }
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_RSS_CONTEXT_SET_KEY;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_RSS_CONTEXT_SET_KEY_IN_LEN;
@@ -496,8 +466,8 @@ efx_mcdi_rss_context_set_table(
        __in            size_t n)
 {
        efx_mcdi_req_t req;
-       uint8_t payload[MAX(MC_CMD_RSS_CONTEXT_SET_TABLE_IN_LEN,
-                           MC_CMD_RSS_CONTEXT_SET_TABLE_OUT_LEN)];
+       EFX_MCDI_DECLARE_BUF(payload, MC_CMD_RSS_CONTEXT_SET_TABLE_IN_LEN,
+               MC_CMD_RSS_CONTEXT_SET_TABLE_OUT_LEN);
        uint8_t *req_table;
        int i, rc;
 
@@ -506,7 +476,6 @@ efx_mcdi_rss_context_set_table(
                goto fail1;
        }
 
-       (void) memset(payload, 0, sizeof (payload));
        req.emr_cmd = MC_CMD_RSS_CONTEXT_SET_TABLE;
        req.emr_in_buf = payload;
        req.emr_in_length = MC_CMD_RSS_CONTEXT_SET_TABLE_IN_LEN;