|
@@ -394,6 +394,42 @@ out:
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int iwl_mvm_start_fw_dbg_conf(struct iwl_mvm *mvm,
|
|
|
|
+ enum iwl_fw_dbg_conf conf_id)
|
|
|
|
+{
|
|
|
|
+ u8 *ptr;
|
|
|
|
+ int ret;
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ if (WARN_ONCE(conf_id >= ARRAY_SIZE(mvm->fw->dbg_conf_tlv),
|
|
|
|
+ "Invalid configuration %d\n", conf_id))
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ if (!mvm->fw->dbg_conf_tlv[conf_id])
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ if (mvm->fw_dbg_conf != FW_DBG_INVALID)
|
|
|
|
+ IWL_WARN(mvm, "FW already configured (%d) - re-configuring\n",
|
|
|
|
+ mvm->fw_dbg_conf);
|
|
|
|
+
|
|
|
|
+ /* Send all HCMDs for configuring the FW debug */
|
|
|
|
+ ptr = (void *)&mvm->fw->dbg_conf_tlv[conf_id]->hcmd;
|
|
|
|
+ for (i = 0; i < mvm->fw->dbg_conf_tlv[conf_id]->num_of_hcmds; i++) {
|
|
|
|
+ struct iwl_fw_dbg_conf_hcmd *cmd = (void *)ptr;
|
|
|
|
+
|
|
|
|
+ ret = iwl_mvm_send_cmd_pdu(mvm, cmd->id, 0,
|
|
|
|
+ le16_to_cpu(cmd->len), cmd->data);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ ptr += sizeof(*cmd);
|
|
|
|
+ ptr += le16_to_cpu(cmd->len);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ mvm->fw_dbg_conf = conf_id;
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+
|
|
int iwl_mvm_up(struct iwl_mvm *mvm)
|
|
int iwl_mvm_up(struct iwl_mvm *mvm)
|
|
{
|
|
{
|
|
int ret, i;
|
|
int ret, i;
|
|
@@ -445,6 +481,9 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
|
|
if (ret)
|
|
if (ret)
|
|
IWL_ERR(mvm, "Failed to initialize Smart Fifo\n");
|
|
IWL_ERR(mvm, "Failed to initialize Smart Fifo\n");
|
|
|
|
|
|
|
|
+ mvm->fw_dbg_conf = FW_DBG_INVALID;
|
|
|
|
+ iwl_mvm_start_fw_dbg_conf(mvm, FW_DBG_CUSTOM);
|
|
|
|
+
|
|
ret = iwl_send_tx_ant_cfg(mvm, mvm->fw->valid_tx_ant);
|
|
ret = iwl_send_tx_ant_cfg(mvm, mvm->fw->valid_tx_ant);
|
|
if (ret)
|
|
if (ret)
|
|
goto error;
|
|
goto error;
|