iwlwifi: dbg: add op_mode callback for collecting debug data.
The first use is collecting debug data when transport stops the device. Signed-off-by: Mordechay Goodstein <mordechay.goodstein@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Link: https://lore.kernel.org/r/iwlwifi.20210210142629.d282d0a9ee7b.I9a0ad29f80daba8956a6aa077ba865e19b2150be@changeid Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
This commit is contained in:
parent
cb3abd2091
commit
d01293154c
5 changed files with 35 additions and 3 deletions
|
@ -1,12 +1,14 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2018-2019 Intel Corporation
|
* Copyright (C) 2018-2020 Intel Corporation
|
||||||
*/
|
*/
|
||||||
#ifndef __iwl_dbg_tlv_h__
|
#ifndef __iwl_dbg_tlv_h__
|
||||||
#define __iwl_dbg_tlv_h__
|
#define __iwl_dbg_tlv_h__
|
||||||
|
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
#include <fw/file.h>
|
||||||
|
#include <fw/api/dbg-tlv.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct iwl_dbg_tlv_node - debug TLV node
|
* struct iwl_dbg_tlv_node - debug TLV node
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2014, 2018-2019 Intel Corporation
|
* Copyright (C) 2005-2014, 2018-2020 Intel Corporation
|
||||||
* Copyright (C) 2013-2014 Intel Mobile Communications GmbH
|
* Copyright (C) 2013-2014 Intel Mobile Communications GmbH
|
||||||
* Copyright (C) 2015 Intel Deutschland GmbH
|
* Copyright (C) 2015 Intel Deutschland GmbH
|
||||||
*/
|
*/
|
||||||
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
|
#include "iwl-dbg-tlv.h"
|
||||||
|
|
||||||
struct iwl_op_mode;
|
struct iwl_op_mode;
|
||||||
struct iwl_trans;
|
struct iwl_trans;
|
||||||
|
@ -83,6 +84,7 @@ struct iwl_cfg;
|
||||||
* @nic_config: configure NIC, called before firmware is started.
|
* @nic_config: configure NIC, called before firmware is started.
|
||||||
* May sleep
|
* May sleep
|
||||||
* @wimax_active: invoked when WiMax becomes active. May sleep
|
* @wimax_active: invoked when WiMax becomes active. May sleep
|
||||||
|
* @time_point: called when transport layer wants to collect debug data
|
||||||
*/
|
*/
|
||||||
struct iwl_op_mode_ops {
|
struct iwl_op_mode_ops {
|
||||||
struct iwl_op_mode *(*start)(struct iwl_trans *trans,
|
struct iwl_op_mode *(*start)(struct iwl_trans *trans,
|
||||||
|
@ -104,6 +106,9 @@ struct iwl_op_mode_ops {
|
||||||
void (*cmd_queue_full)(struct iwl_op_mode *op_mode);
|
void (*cmd_queue_full)(struct iwl_op_mode *op_mode);
|
||||||
void (*nic_config)(struct iwl_op_mode *op_mode);
|
void (*nic_config)(struct iwl_op_mode *op_mode);
|
||||||
void (*wimax_active)(struct iwl_op_mode *op_mode);
|
void (*wimax_active)(struct iwl_op_mode *op_mode);
|
||||||
|
void (*time_point)(struct iwl_op_mode *op_mode,
|
||||||
|
enum iwl_fw_ini_time_point tp_id,
|
||||||
|
union iwl_dbg_tlv_tp_data *tp_data);
|
||||||
};
|
};
|
||||||
|
|
||||||
int iwl_opmode_register(const char *name, const struct iwl_op_mode_ops *ops);
|
int iwl_opmode_register(const char *name, const struct iwl_op_mode_ops *ops);
|
||||||
|
@ -196,4 +201,11 @@ static inline void iwl_op_mode_wimax_active(struct iwl_op_mode *op_mode)
|
||||||
op_mode->ops->wimax_active(op_mode);
|
op_mode->ops->wimax_active(op_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void iwl_op_mode_time_point(struct iwl_op_mode *op_mode,
|
||||||
|
enum iwl_fw_ini_time_point tp_id,
|
||||||
|
union iwl_dbg_tlv_tp_data *tp_data)
|
||||||
|
{
|
||||||
|
op_mode->ops->time_point(op_mode, tp_id, tp_data);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __iwl_op_mode_h__ */
|
#endif /* __iwl_op_mode_h__ */
|
||||||
|
|
|
@ -1412,6 +1412,15 @@ static void iwl_mvm_cmd_queue_full(struct iwl_op_mode *op_mode)
|
||||||
iwl_mvm_nic_restart(mvm, true);
|
iwl_mvm_nic_restart(mvm, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void iwl_op_mode_mvm_time_point(struct iwl_op_mode *op_mode,
|
||||||
|
enum iwl_fw_ini_time_point tp_id,
|
||||||
|
union iwl_dbg_tlv_tp_data *tp_data)
|
||||||
|
{
|
||||||
|
struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
|
||||||
|
|
||||||
|
iwl_dbg_tlv_time_point(&mvm->fwrt, tp_id, tp_data);
|
||||||
|
}
|
||||||
|
|
||||||
#define IWL_MVM_COMMON_OPS \
|
#define IWL_MVM_COMMON_OPS \
|
||||||
/* these could be differentiated */ \
|
/* these could be differentiated */ \
|
||||||
.async_cb = iwl_mvm_async_cb, \
|
.async_cb = iwl_mvm_async_cb, \
|
||||||
|
@ -1424,7 +1433,8 @@ static void iwl_mvm_cmd_queue_full(struct iwl_op_mode *op_mode)
|
||||||
.nic_config = iwl_mvm_nic_config, \
|
.nic_config = iwl_mvm_nic_config, \
|
||||||
/* as we only register one, these MUST be common! */ \
|
/* as we only register one, these MUST be common! */ \
|
||||||
.start = iwl_op_mode_mvm_start, \
|
.start = iwl_op_mode_mvm_start, \
|
||||||
.stop = iwl_op_mode_mvm_stop
|
.stop = iwl_op_mode_mvm_stop, \
|
||||||
|
.time_point = iwl_op_mode_mvm_time_point
|
||||||
|
|
||||||
static const struct iwl_op_mode_ops iwl_mvm_ops = {
|
static const struct iwl_op_mode_ops iwl_mvm_ops = {
|
||||||
IWL_MVM_COMMON_OPS,
|
IWL_MVM_COMMON_OPS,
|
||||||
|
|
|
@ -198,6 +198,10 @@ void iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans)
|
||||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||||
bool was_in_rfkill;
|
bool was_in_rfkill;
|
||||||
|
|
||||||
|
iwl_op_mode_time_point(trans->op_mode,
|
||||||
|
IWL_FW_INI_TIME_POINT_HOST_DEVICE_DISABLE,
|
||||||
|
NULL);
|
||||||
|
|
||||||
mutex_lock(&trans_pcie->mutex);
|
mutex_lock(&trans_pcie->mutex);
|
||||||
trans_pcie->opmode_down = true;
|
trans_pcie->opmode_down = true;
|
||||||
was_in_rfkill = test_bit(STATUS_RFKILL_OPMODE, &trans->status);
|
was_in_rfkill = test_bit(STATUS_RFKILL_OPMODE, &trans->status);
|
||||||
|
|
|
@ -1380,6 +1380,10 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
|
||||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||||
bool was_in_rfkill;
|
bool was_in_rfkill;
|
||||||
|
|
||||||
|
iwl_op_mode_time_point(trans->op_mode,
|
||||||
|
IWL_FW_INI_TIME_POINT_HOST_DEVICE_DISABLE,
|
||||||
|
NULL);
|
||||||
|
|
||||||
mutex_lock(&trans_pcie->mutex);
|
mutex_lock(&trans_pcie->mutex);
|
||||||
trans_pcie->opmode_down = true;
|
trans_pcie->opmode_down = true;
|
||||||
was_in_rfkill = test_bit(STATUS_RFKILL_OPMODE, &trans->status);
|
was_in_rfkill = test_bit(STATUS_RFKILL_OPMODE, &trans->status);
|
||||||
|
|
Loading…
Add table
Reference in a new issue