Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp3913597pxb; Tue, 2 Nov 2021 00:16:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxl7cRFBqEEeRlweAZ9POPtM4m2odtwQW1vuPwqajAzPajS2PTOFhnpnJiQ61qx20p2yoDv X-Received: by 2002:a05:6e02:16c9:: with SMTP id 9mr23699077ilx.166.1635837377508; Tue, 02 Nov 2021 00:16:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635837377; cv=none; d=google.com; s=arc-20160816; b=fisQ6GUWvjMtX1k4tmJl5iJYXvsTad+TPsdz3QvGmKUqDE4euEwqzfVPjp6bkjToMX M9WXj9mP/mS6O5R5Y6ZjjF+XwyXPPwUBXifmb3WJOtPXRW2pTAKKG+JTs0U43XEC+L70 G6yON2+BA3q1OzinHT7+HZiiS2ryTPFc5Z6BIZKurxeWNVRDCR5NNqVzJbvgvDkMDnJd mgxiMOfQhNRXxgh0O4IdEhVMj2srH2k4LzhcFfp4/FFMyi2Zp3Jv0/zSWDaI06yP8CTY bNpQcle6arpgzPre+4OLiYgvBg1p+gQtDRlmn8BjvpjCbUFwF/F6UKiYhl//r4fFYqyd moaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=styJU8qYHpzHdW8yuKTReQzFiu1ara8odd9GRJzxorc=; b=OXFJhsGZLAom310guTI6LL5HBTBO395sJ51oNso6up+0NWy+ZEccq+Z3c+LkIC19Dt li9j0KmEArjcK8K4Jmq6UOa9+MczRNNkaNG44f04NdTRrvb43wNXkgj1pnZJhKsVpGsM ykfIiePW4QVVFmGtoBEmA3SQXnp5c3RXgp3OR3KAyo0dS51MJUsKW6B+zVgMZWTxdMWt bgxFwPPGYBnw3tCIvYzedZFCF5awbSxyMTt9QUFjII0MBWZbfgu+U8KrFPNss0eATJJ6 FRCcpOAdXta2/CiZLon0NF+fZHCiHMbXFzS6nHhYhkH29IERGM4IYoxNOJ06YeEBTY8I 5SRA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y4si27791625ilv.58.2021.11.02.00.16.08; Tue, 02 Nov 2021 00:16:17 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230451AbhKBHSf (ORCPT + 66 others); Tue, 2 Nov 2021 03:18:35 -0400 Received: from mga02.intel.com ([134.134.136.20]:22772 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229497AbhKBHSf (ORCPT ); Tue, 2 Nov 2021 03:18:35 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10155"; a="218394165" X-IronPort-AV: E=Sophos;i="5.87,202,1631602800"; d="scan'208";a="218394165" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Nov 2021 00:16:00 -0700 X-IronPort-AV: E=Sophos;i="5.87,202,1631602800"; d="scan'208";a="638099986" Received: from egrumbac-mobl1.jer.intel.com ([10.13.16.230]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Nov 2021 00:15:58 -0700 From: Emmanuel Grumbach To: kvalo@codeaurora.org Cc: linux-wireless@vger.kernel.org Subject: [PATCH 3/6] iwlwifi: mei: add debugfs hooks Date: Tue, 2 Nov 2021 09:15:46 +0200 Message-Id: <20211102071549.5833-3-emmanuel.grumbach@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211102071549.5833-1-emmanuel.grumbach@intel.com> References: <20211102071549.5833-1-emmanuel.grumbach@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Add three debugfs hooks: * status: Check if we have a connection with the CSME firwmare. This hook is a read only. * req_ownership: Send a SAP command to request ownership. This flow should be triggered by iwlwifi (from user space through vendor commands really), but being able to trigger an ownership request from debugfs allows us to request ownership without connecting afterwards. This is an "error" flow that the CSME firmware is designed to handle this way: + Grant ownership since the host asked for it + Wait 3 seconds to let the host connect + If the host didn't connect, take the device back (forcefully). + Don't grant any new ownership request in the following 30 seconds. This debugfs hook allows us to test this flow. * send_start_message: Restart the communication with the CSME firmware from the very beginning. At the very beginning (upon iwlwifi start), iwlmei send a special message: SAP_ME_MSG_START. This hook allows to send it again and this will retrigger the whole flow. It is important to test this restart in the middle of normal operation since it can happen (in case the CSME firmware decided to reset for example). Signed-off-by: Emmanuel Grumbach --- drivers/net/wireless/intel/iwlwifi/mei/main.c | 85 ++++++++++++++++++- 1 file changed, 83 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/intel/iwlwifi/mei/main.c b/drivers/net/wireless/intel/iwlwifi/mei/main.c index f0032ef87790..e57c289c3dfc 100644 --- a/drivers/net/wireless/intel/iwlwifi/mei/main.c +++ b/drivers/net/wireless/intel/iwlwifi/mei/main.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -149,6 +150,7 @@ struct iwl_mei_filters { * accessed without the mutex. * @sap_seq_no: the sequence number for the SAP messages * @seq_no: the sequence number for the SAP messages + * @dbgfs_dir: the debugfs dir entry */ struct iwl_mei { wait_queue_head_t get_nvm_wq; @@ -167,6 +169,8 @@ struct iwl_mei { atomic_t sap_seq_no; atomic_t seq_no; + + struct dentry *dbgfs_dir; }; /** @@ -1684,6 +1688,78 @@ void iwl_mei_unregister_complete(void) } EXPORT_SYMBOL_GPL(iwl_mei_unregister_complete); +#if IS_ENABLED(CONFIG_DEBUG_FS) + +static ssize_t +iwl_mei_dbgfs_send_start_message_write(struct file *file, + const char __user *user_buf, + size_t count, loff_t *ppos) +{ + int ret; + + mutex_lock(&iwl_mei_mutex); + + if (!iwl_mei_global_cldev) { + ret = -ENODEV; + goto out; + } + + ret = iwl_mei_send_start(iwl_mei_global_cldev); + +out: + mutex_unlock(&iwl_mei_mutex); + return ret ?: count; +} + +static const struct file_operations iwl_mei_dbgfs_send_start_message_ops = { + .write = iwl_mei_dbgfs_send_start_message_write, + .open = simple_open, + .llseek = default_llseek, +}; + +static ssize_t iwl_mei_dbgfs_req_ownership_write(struct file *file, + const char __user *user_buf, + size_t count, loff_t *ppos) +{ + iwl_mei_get_ownership(); + + return count; +} + +static const struct file_operations iwl_mei_dbgfs_req_ownership_ops = { + .write = iwl_mei_dbgfs_req_ownership_write, + .open = simple_open, + .llseek = default_llseek, +}; + +static void iwl_mei_dbgfs_register(struct iwl_mei *mei) +{ + mei->dbgfs_dir = debugfs_create_dir(KBUILD_MODNAME, NULL); + + if (!mei->dbgfs_dir) + return; + + debugfs_create_ulong("status", S_IRUSR, + mei->dbgfs_dir, &iwl_mei_status); + debugfs_create_file("send_start_message", S_IWUSR, mei->dbgfs_dir, + mei, &iwl_mei_dbgfs_send_start_message_ops); + debugfs_create_file("req_ownserhip", S_IWUSR, mei->dbgfs_dir, + mei, &iwl_mei_dbgfs_req_ownership_ops); +} + +static void iwl_mei_dbgfs_unregister(struct iwl_mei *mei) +{ + debugfs_remove_recursive(mei->dbgfs_dir); + mei->dbgfs_dir = NULL; +} + +#else + +static void iwl_mei_dbgfs_register(struct iwl_mei *mei) {} +static void iwl_mei_dbgfs_unregister(struct iwl_mei *mei) {} + +#endif /* CONFIG_DEBUG_FS */ + /** * iwl_mei_probe - the probe function called by the mei bus enumeration * @@ -1722,6 +1798,8 @@ static int iwl_mei_probe(struct mei_cl_device *cldev, if (ret) goto free_shared_mem; + iwl_mei_dbgfs_register(mei); + /* * We now have a Rx function in place, start the SAP procotol * we expect to get the SAP_ME_MSG_START_OK response later on. @@ -1730,14 +1808,15 @@ static int iwl_mei_probe(struct mei_cl_device *cldev, ret = iwl_mei_send_start(cldev); mutex_unlock(&iwl_mei_mutex); if (ret) - goto disable; + goto debugfs_unregister; /* must be last */ iwl_mei_global_cldev = cldev; return 0; -disable: +debugfs_unregister: + iwl_mei_dbgfs_unregister(mei); mei_cldev_disable(cldev); free_shared_mem: iwl_mei_free_shared_mem(cldev); @@ -1857,6 +1936,8 @@ static void iwl_mei_remove(struct mei_cl_device *cldev) iwl_mei_free_shared_mem(cldev); + iwl_mei_dbgfs_unregister(mei); + mei_cldev_set_drvdata(cldev, NULL); kfree(mei->nvm); -- 2.25.1