[PATCH v7 2/8] ath10k: provide firmware crash info via debugfs
Michal Kazior
michal.kazior at tieto.com
Tue Aug 19 23:28:14 PDT 2014
On 19 August 2014 17:25, Ben Greear <greearb at candelatech.com> wrote:
> On 08/19/2014 02:33 AM, Michal Kazior wrote:
>> On 19 August 2014 10:22, Kalle Valo <kvalo at qca.qualcomm.com> wrote:
[...]
>>> + __le32 target_version;
>>> + __le32 fw_version_major;
>>> + __le32 fw_version_minor;
>>> + __le32 fw_version_release;
>>> + __le32 fw_version_build;
>>> + __le32 phy_capability;
>>> + __le32 hw_min_tx_power;
>>> + __le32 hw_max_tx_power;
>>> + __le32 ht_cap_info;
>>> + __le32 vht_cap_info;
>>> + __le32 num_rf_chains;
>>
>>
>> Hmm.. some of these values don't really change once driver is loaded
>> so we could probably just export them as separate debugfs entries but
>> perhaps that's an overkill just for dumping.
>
>
> I think it will be easier for all involved if there is a single dump image
> that
> has all needed info. Likely the end user of the dump file will have little
> or no
> interaction with the host that dumped the file to begin with.
I think there's been this idea about moving dumping to udev somewhat,
no? Since this is just debugfs then I imagine you could have a
userspace program that would create the single blob/crash report from
things it thinks is important, e.g.. `uname -a`, debugfs entries (fw
stack traces, dbglog, etc), recent kernel log buffer, etc. It could
even all be stored in plaintext (with binary data encoded as a
hexdump). But that, I guess, could be cumbersome, at least initially,
until all major distros adapt.
>
>>> + dump_data->kernel_ver_code = cpu_to_le32(LINUX_VERSION_CODE);
>>> + strlcpy(dump_data->kernel_ver, VERMAGIC_STRING,
>>> + sizeof(dump_data->kernel_ver));
>>> +
>>> + dump_data->tv_sec = cpu_to_le64(crash_data->timestamp.tv_sec);
>>> + dump_data->tv_nsec = cpu_to_le64(crash_data->timestamp.tv_nsec);
>>> +
>>> + /* Gather dbg-log */
>>> + dump_tlv = (struct ath10k_tlv_dump_data *)(buf + sofar);
>>> + dump_tlv->type = cpu_to_le32(ATH10K_FW_CRASH_DUMP_DBGLOG);
>>> + dump_tlv->tlv_len =
>>> cpu_to_le32(sizeof(crash_data->dbglog_entry_data));
>>
>>
>> Hmm should this really be sizeof()? Not next_idx (which effectively
>> defines number of bytes of the dbglog)?
>
>
> I haven't tried decoding this yet, but we may need to know the next_idx
> to decode this properly.
So basically a (length, payload) encoding would be necessary here
instead of a single stream, right?
>>> + ret = ath10k_pci_diag_read_mem(ar, dbuf.buffer, buffer,
>>> + dbuf.length);
>>> + if (ret != 0) {
>>> + ath10k_warn("failed to read debug log buffer from
>>> address 0x%x: %d\n",
>>> + dbuf.buffer, ret);
>>> + kfree(buffer);
>>> + return;
>>> + }
>>> +
>>> + ath10k_debug_dbglog_add(ar, buffer, dbuf.length);
>>> + kfree(buffer);
>>
>>
>> Is the `buffer` really a string of bytes (u8) or just u32 in disguise?
>> If it's the former then on big-endian host the implicit byte swap will
>> mess it up and userspace will have no way of knowing that now.
>
>
> dbglog is array of 32 bit ints.
Thanks, this clears things. Then it is necessary to byte-swap
cpu_to_le32 before calling debug_dbglog_add.
Michał
More information about the ath10k
mailing list