iwlwifi: mei: report RFKILL upon register when needed
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Fri, 28 Jan 2022 12:30:57 +0000 (14:30 +0200)
committerKalle Valo <kvalo@kernel.org>
Thu, 3 Feb 2022 08:24:51 +0000 (10:24 +0200)
When we register and we are in link protection passive, meaning
that the host can't touch the device, report RFKILL immediately
upon register() and don't wait for the CSME firmware to let us
know again about the link protection state.

What happens if we wait is that the host will not see RFKILL soon
enough and we'll have a window of time during which it can bring
up the device which will request ownership.

Fixes: 2da4366f9e2c ("iwlwifi: mei: add the driver to allow cooperation with CSME")
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/iwlwifi.20220128142706.a136f9f46336.Ief7506dc3b1813a1943a5a639aa45d8e5f284f31@changeid
drivers/net/wireless/intel/iwlwifi/mei/main.c

index 6cc5553027a011f728969192832968c8702db353..2f7f0f994ca32805d2c5cb7e9c0af28ab981a64e 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (C) 2021 Intel Corporation
+ * Copyright (C) 2021-2022 Intel Corporation
  */
 
 #include <linux/etherdevice.h>
@@ -146,6 +146,7 @@ struct iwl_mei_filters {
  * @csme_taking_ownership: true when CSME is taking ownership. Used to remember
  *     to send CSME_OWNERSHIP_CONFIRMED when the driver completes its down
  *     flow.
+ * @link_prot_state: true when we are in link protection PASSIVE
  * @csa_throttle_end_wk: used when &csa_throttled is true
  * @data_q_lock: protects the access to the data queues which are
  *     accessed without the mutex.
@@ -165,6 +166,7 @@ struct iwl_mei {
        bool amt_enabled;
        bool csa_throttled;
        bool csme_taking_ownership;
+       bool link_prot_state;
        struct delayed_work csa_throttle_end_wk;
        spinlock_t data_q_lock;
 
@@ -667,6 +669,8 @@ iwl_mei_handle_conn_status(struct mei_cl_device *cldev,
 
        iwl_mei_cache.ops->me_conn_status(iwl_mei_cache.priv, &conn_info);
 
+       mei->link_prot_state = status->link_prot_state;
+
        /*
         * Update the Rfkill state in case the host does not own the device:
         * if we are in Link Protection, ask to not touch the device, else,
@@ -1661,9 +1665,11 @@ int iwl_mei_register(void *priv, const struct iwl_mei_ops *ops)
                        mei_cldev_get_drvdata(iwl_mei_global_cldev);
 
                /* we have already a SAP connection */
-               if (iwl_mei_is_connected())
+               if (iwl_mei_is_connected()) {
                        iwl_mei_send_sap_msg(mei->cldev,
                                             SAP_MSG_NOTIF_WIFIDR_UP);
+                       ops->rfkill(priv, mei->link_prot_state);
+               }
        }
        ret = 0;