]> git.baikalelectronics.ru Git - kernel.git/commitdiff
iwlwifi: mvm: introduce iwl_proto_offload_cmd_v4
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Fri, 18 Jun 2021 08:01:21 +0000 (11:01 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 22 Jun 2021 13:57:56 +0000 (16:57 +0300)
We need to pass the station id to tell the firmware
on which station we want to configure the protocol
offload.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210618105614.c25913d2c08c.Ic0fefac81afb9a2fe396d73528e30e09a8c5eae0@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/d3.h
drivers/net/wireless/intel/iwlwifi/mvm/d3.c
drivers/net/wireless/intel/iwlwifi/mvm/offloading.c

index 5373182c136461ce2afd4314c47d155245a4c3f3..a9e8f30ef91dee823aab75c2663d3810df8f3f80 100644 (file)
@@ -159,6 +159,22 @@ struct iwl_proto_offload_cmd_v3_large {
        struct iwl_ns_config ns_config[IWL_PROTO_OFFLOAD_NUM_NS_CONFIG_V3L];
 } __packed; /* PROT_OFFLOAD_CONFIG_CMD_DB_S_VER_3 */
 
+/**
+ * struct iwl_proto_offload_cmd_v4 - ARP/NS offload configuration
+ * @sta_id: station id
+ * @common: common/IPv4 configuration
+ * @num_valid_ipv6_addrs: number of valid IPv6 addresses
+ * @targ_addrs: target IPv6 addresses
+ * @ns_config: NS offload configurations
+ */
+struct iwl_proto_offload_cmd_v4 {
+       __le32 sta_id;
+       struct iwl_proto_offload_cmd_common common;
+       __le32 num_valid_ipv6_addrs;
+       struct iwl_targ_addr targ_addrs[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V3L];
+       struct iwl_ns_config ns_config[IWL_PROTO_OFFLOAD_NUM_NS_CONFIG_V3L];
+} __packed; /* PROT_OFFLOAD_CONFIG_CMD_DB_S_VER_4 */
+
 /*
  * WOWLAN_PATTERNS
  */
index 6617fe5a7ecebb27c9a39e4388f57b63098a041e..7b13c4fc1b58972c4beaa01c547c0b2802efbd73 100644 (file)
@@ -1693,10 +1693,13 @@ iwl_mvm_get_wakeup_status(struct iwl_mvm *mvm)
 {
        int ret;
 
-       /* only for tracing for now */
-       ret = iwl_mvm_send_cmd_pdu(mvm, OFFLOADS_QUERY_CMD, 0, 0, NULL);
-       if (ret)
-               IWL_ERR(mvm, "failed to query offload statistics (%d)\n", ret);
+       if (!mvm->net_detect) {
+               /* only for tracing for now */
+               int ret = iwl_mvm_send_cmd_pdu(mvm, OFFLOADS_QUERY_CMD, 0,
+                                              0, NULL);
+               if (ret)
+                       IWL_ERR(mvm, "failed to query offload statistics (%d)\n", ret);
+       }
 
        return iwl_mvm_send_wowlan_get_status(mvm);
 }
index 1cc90e61367b048808270614d65c457f3068d3ec..41880517e8bb4f5c32d364fff6c776771d2f5369 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 /*
- * Copyright (C) 2012-2014 Intel Corporation
+ * Copyright (C) 2012-2014, 2021 Intel Corporation
  * Copyright (C) 2013-2014 Intel Mobile Communications GmbH
  * Copyright (C) 2015 Intel Deutschland GmbH
  */
@@ -36,7 +36,7 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
                struct iwl_proto_offload_cmd_v1 v1;
                struct iwl_proto_offload_cmd_v2 v2;
                struct iwl_proto_offload_cmd_v3_small v3s;
-               struct iwl_proto_offload_cmd_v3_large v3l;
+               struct iwl_proto_offload_cmd_v4 v4;
        } cmd = {};
        struct iwl_host_cmd hcmd = {
                .id = PROT_OFFLOAD_CONFIG_CMD,
@@ -47,6 +47,9 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
        struct iwl_proto_offload_cmd_common *common;
        u32 enabled = 0, size;
        u32 capa_flags = mvm->fw->ucode_capa.flags;
+       int ver = iwl_fw_lookup_cmd_ver(mvm->fw, LONG_GROUP,
+                                       PROT_OFFLOAD_CONFIG_CMD, 0);
+
 #if IS_ENABLED(CONFIG_IPV6)
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
        int i;
@@ -72,9 +75,9 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
                        addrs = cmd.v3s.targ_addrs;
                        n_addrs = IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V3S;
                } else {
-                       nsc = cmd.v3l.ns_config;
+                       nsc = cmd.v4.ns_config;
                        n_nsc = IWL_PROTO_OFFLOAD_NUM_NS_CONFIG_V3L;
-                       addrs = cmd.v3l.targ_addrs;
+                       addrs = cmd.v4.targ_addrs;
                        n_addrs = IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V3L;
                }
 
@@ -116,7 +119,7 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
                        cmd.v3s.num_valid_ipv6_addrs =
                                cpu_to_le32(i - num_skipped);
                else
-                       cmd.v3l.num_valid_ipv6_addrs =
+                       cmd.v4.num_valid_ipv6_addrs =
                                cpu_to_le32(i - num_skipped);
        } else if (capa_flags & IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS) {
                bool found = false;
@@ -171,8 +174,17 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
                common = &cmd.v3s.common;
                size = sizeof(cmd.v3s);
        } else if (capa_flags & IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE) {
-               common = &cmd.v3l.common;
-               size = sizeof(cmd.v3l);
+               common = &cmd.v4.common;
+               size = sizeof(cmd.v4);
+               if (ver < 4) {
+                       /*
+                        * This basically uses iwl_proto_offload_cmd_v3_large
+                        * which doesn't have the sta_id parameter before the
+                        * common part.
+                        */
+                       size -= sizeof(cmd.v4.sta_id);
+                       hcmd.data[0] = common;
+               }
        } else if (capa_flags & IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS) {
                common = &cmd.v2.common;
                size = sizeof(cmd.v2);