iwlwifi: mvm: check firmware is up in debugfs
authorJohannes Berg <johannes.berg@intel.com>
Wed, 22 Mar 2017 21:19:41 +0000 (22:19 +0100)
committerLuca Coelho <luciano.coelho@intel.com>
Mon, 5 Jun 2017 20:29:38 +0000 (23:29 +0300)
Protect various debugfs files that need to communicate with the
firmware from being used when the firmware isn't running.

Some will just reject getting written to, while others that store
some state will simply store it and not apply it immediately.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c

index 59aaab8274c275e5ff785e399fecf2c8356d72d3..25092cb08c2eaf004954689260abf4a13546c101 100644 (file)
@@ -583,7 +583,11 @@ iwl_dbgfs_bt_force_ant_write(struct iwl_mvm *mvm, char *buf,
        mvm->bt_force_ant_mode = bt_force_ant_mode;
        IWL_DEBUG_COEX(mvm, "Force mode: %s\n",
                       modes_str[mvm->bt_force_ant_mode]);
-       ret = iwl_send_bt_init_conf(mvm);
+
+       if (iwl_mvm_firmware_running(mvm))
+               ret = iwl_send_bt_init_conf(mvm);
+       else
+               ret = 0;
 
 out:
        mutex_unlock(&mvm->mutex);
@@ -800,6 +804,9 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct iwl_mvm *mvm, char *buf,
 {
        int __maybe_unused ret;
 
+       if (!iwl_mvm_firmware_running(mvm))
+               return -EIO;
+
        mutex_lock(&mvm->mutex);
 
        /* allow one more restart that we're provoking here */
@@ -817,7 +824,12 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct iwl_mvm *mvm, char *buf,
 static ssize_t iwl_dbgfs_fw_nmi_write(struct iwl_mvm *mvm, char *buf,
                                      size_t count, loff_t *ppos)
 {
-       int ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_NMI);
+       int ret;
+
+       if (!iwl_mvm_firmware_running(mvm))
+               return -EIO;
+
+       ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_NMI);
        if (ret)
                return ret;
 
@@ -857,6 +869,9 @@ iwl_dbgfs_scan_ant_rxchain_write(struct iwl_mvm *mvm, char *buf,
 {
        u8 scan_rx_ant;
 
+       if (!iwl_mvm_firmware_running(mvm))
+               return -EIO;
+
        if (sscanf(buf, "%hhx", &scan_rx_ant) != 1)
                return -EINVAL;
        if (scan_rx_ant > ANT_ABC)
@@ -911,7 +926,11 @@ static ssize_t iwl_dbgfs_indirection_tbl_write(struct iwl_mvm *mvm,
        netdev_rss_key_fill(cmd.secret_key, sizeof(cmd.secret_key));
 
        mutex_lock(&mvm->mutex);
-       ret = iwl_mvm_send_cmd_pdu(mvm, RSS_CONFIG_CMD, 0, sizeof(cmd), &cmd);
+       if (iwl_mvm_firmware_running(mvm))
+               ret = iwl_mvm_send_cmd_pdu(mvm, RSS_CONFIG_CMD, 0,
+                                          sizeof(cmd), &cmd);
+       else
+               ret = 0;
        mutex_unlock(&mvm->mutex);
 
        return ret ?: count;
@@ -931,6 +950,9 @@ static ssize_t iwl_dbgfs_inject_packet_write(struct iwl_mvm *mvm,
        int bin_len = count / 2;
        int ret = -EINVAL;
 
+       if (!iwl_mvm_firmware_running(mvm))
+               return -EIO;
+
        /* supporting only 9000 descriptor */
        if (!mvm->trans->cfg->mq_rx_supported)
                return -ENOTSUPP;
@@ -1004,6 +1026,9 @@ static ssize_t iwl_dbgfs_cont_recording_write(struct iwl_mvm *mvm,
        struct iwl_continuous_record_cmd cont_rec = {};
        int ret, rec_mode;
 
+       if (!iwl_mvm_firmware_running(mvm))
+               return -EIO;
+
        if (!dest)
                return -EOPNOTSUPP;
 
@@ -1034,6 +1059,9 @@ static ssize_t iwl_dbgfs_fw_dbg_conf_write(struct iwl_mvm *mvm,
        unsigned int conf_id;
        int ret;
 
+       if (!iwl_mvm_firmware_running(mvm))
+               return -EIO;
+
        ret = kstrtouint(buf, 0, &conf_id);
        if (ret)
                return ret;
@@ -1052,8 +1080,12 @@ static ssize_t iwl_dbgfs_fw_dbg_collect_write(struct iwl_mvm *mvm,
                                              char *buf, size_t count,
                                              loff_t *ppos)
 {
-       int ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_PRPH_WRITE);
+       int ret;
+
+       if (!iwl_mvm_firmware_running(mvm))
+               return -EIO;
 
+       ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_PRPH_WRITE);
        if (ret)
                return ret;
        if (count == 0)
@@ -1184,7 +1216,8 @@ static ssize_t iwl_dbgfs_bcast_filters_write(struct iwl_mvm *mvm, char *buf,
               &filter, sizeof(filter));
 
        /* send updated bcast filtering configuration */
-       if (mvm->dbgfs_bcast_filtering.override &&
+       if (iwl_mvm_firmware_running(mvm) &&
+           mvm->dbgfs_bcast_filtering.override &&
            iwl_mvm_bcast_filter_build_cmd(mvm, &cmd))
                err = iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, 0,
                                           sizeof(cmd), &cmd);
@@ -1256,7 +1289,8 @@ static ssize_t iwl_dbgfs_bcast_filters_macs_write(struct iwl_mvm *mvm,
               &mac, sizeof(mac));
 
        /* send updated bcast filtering configuration */
-       if (mvm->dbgfs_bcast_filtering.override &&
+       if (iwl_mvm_firmware_running(mvm) &&
+           mvm->dbgfs_bcast_filtering.override &&
            iwl_mvm_bcast_filter_build_cmd(mvm, &cmd))
                err = iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, 0,
                                           sizeof(cmd), &cmd);
@@ -1473,6 +1507,9 @@ iwl_dbgfs_send_echo_cmd_write(struct iwl_mvm *mvm, char *buf,
 {
        int ret;
 
+       if (!iwl_mvm_firmware_running(mvm))
+               return -EIO;
+
        mutex_lock(&mvm->mutex);
        ret = iwl_mvm_send_cmd_pdu(mvm, ECHO_CMD, 0, 0, NULL);
        mutex_unlock(&mvm->mutex);
@@ -1534,6 +1571,9 @@ static ssize_t iwl_dbgfs_mem_read(struct file *file, char __user *user_buf,
        size_t delta;
        ssize_t ret, len;
 
+       if (!iwl_mvm_firmware_running(mvm))
+               return -EIO;
+
        hcmd.id = iwl_cmd_id(*ppos >> 24 ? UMAC_RD_WR : LMAC_RD_WR,
                             DEBUG_GROUP, 0);
        cmd.op = cpu_to_le32(DEBUG_MEM_OP_READ);
@@ -1586,6 +1626,9 @@ static ssize_t iwl_dbgfs_mem_write(struct file *file,
        u32 op, len;
        ssize_t ret;
 
+       if (!iwl_mvm_firmware_running(mvm))
+               return -EIO;
+
        hcmd.id = iwl_cmd_id(*ppos >> 24 ? UMAC_RD_WR : LMAC_RD_WR,
                             DEBUG_GROUP, 0);