Merge "wil6210: extract firmware version from file header"
This commit is contained in:
commit
fa6c7033dc
7 changed files with 46 additions and 6 deletions
|
@ -1583,6 +1583,32 @@ static const struct file_operations fops_fw_capabilities = {
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*---------FW version------------*/
|
||||||
|
static int wil_fw_version_debugfs_show(struct seq_file *s, void *data)
|
||||||
|
{
|
||||||
|
struct wil6210_priv *wil = s->private;
|
||||||
|
|
||||||
|
if (wil->fw_version[0])
|
||||||
|
seq_printf(s, "%s\n", wil->fw_version);
|
||||||
|
else
|
||||||
|
seq_puts(s, "N/A\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int wil_fw_version_seq_open(struct inode *inode, struct file *file)
|
||||||
|
{
|
||||||
|
return single_open(file, wil_fw_version_debugfs_show,
|
||||||
|
inode->i_private);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct file_operations fops_fw_version = {
|
||||||
|
.open = wil_fw_version_seq_open,
|
||||||
|
.release = single_release,
|
||||||
|
.read = seq_read,
|
||||||
|
.llseek = seq_lseek,
|
||||||
|
};
|
||||||
|
|
||||||
/*----------------*/
|
/*----------------*/
|
||||||
static void wil6210_debugfs_init_blobs(struct wil6210_priv *wil,
|
static void wil6210_debugfs_init_blobs(struct wil6210_priv *wil,
|
||||||
struct dentry *dbg)
|
struct dentry *dbg)
|
||||||
|
@ -1634,6 +1660,7 @@ static const struct {
|
||||||
{"led_cfg", S_IRUGO | S_IWUSR, &fops_led_cfg},
|
{"led_cfg", S_IRUGO | S_IWUSR, &fops_led_cfg},
|
||||||
{"led_blink_time", S_IRUGO | S_IWUSR, &fops_led_blink_time},
|
{"led_blink_time", S_IRUGO | S_IWUSR, &fops_led_blink_time},
|
||||||
{"fw_capabilities", S_IRUGO, &fops_fw_capabilities},
|
{"fw_capabilities", S_IRUGO, &fops_fw_capabilities},
|
||||||
|
{"fw_version", S_IRUGO, &fops_fw_version},
|
||||||
};
|
};
|
||||||
|
|
||||||
static void wil6210_debugfs_init_files(struct wil6210_priv *wil,
|
static void wil6210_debugfs_init_files(struct wil6210_priv *wil,
|
||||||
|
@ -1674,7 +1701,6 @@ static void wil6210_debugfs_init_isr(struct wil6210_priv *wil,
|
||||||
static const struct dbg_off dbg_wil_off[] = {
|
static const struct dbg_off dbg_wil_off[] = {
|
||||||
WIL_FIELD(privacy, S_IRUGO, doff_u32),
|
WIL_FIELD(privacy, S_IRUGO, doff_u32),
|
||||||
WIL_FIELD(status[0], S_IRUGO | S_IWUSR, doff_ulong),
|
WIL_FIELD(status[0], S_IRUGO | S_IWUSR, doff_ulong),
|
||||||
WIL_FIELD(fw_version, S_IRUGO, doff_u32),
|
|
||||||
WIL_FIELD(hw_version, S_IRUGO, doff_x32),
|
WIL_FIELD(hw_version, S_IRUGO, doff_x32),
|
||||||
WIL_FIELD(recovery_count, S_IRUGO, doff_u32),
|
WIL_FIELD(recovery_count, S_IRUGO, doff_u32),
|
||||||
WIL_FIELD(ap_isolate, S_IRUGO, doff_u32),
|
WIL_FIELD(ap_isolate, S_IRUGO, doff_u32),
|
||||||
|
|
|
@ -102,6 +102,9 @@ struct wil_fw_record_verify { /* type == wil_fw_verify */
|
||||||
/* file header
|
/* file header
|
||||||
* First record of every file
|
* First record of every file
|
||||||
*/
|
*/
|
||||||
|
/* the FW version prefix in the comment */
|
||||||
|
#define WIL_FW_VERSION_PREFIX "FW version: "
|
||||||
|
#define WIL_FW_VERSION_PREFIX_LEN (sizeof(WIL_FW_VERSION_PREFIX) - 1)
|
||||||
struct wil_fw_record_file_header {
|
struct wil_fw_record_file_header {
|
||||||
__le32 signature ; /* Wilocity signature */
|
__le32 signature ; /* Wilocity signature */
|
||||||
__le32 reserved;
|
__le32 reserved;
|
||||||
|
|
|
@ -223,6 +223,13 @@ static int fw_handle_file_header(struct wil6210_priv *wil, const void *data,
|
||||||
wil_hex_dump_fw("", DUMP_PREFIX_OFFSET, 16, 1, d->comment,
|
wil_hex_dump_fw("", DUMP_PREFIX_OFFSET, 16, 1, d->comment,
|
||||||
sizeof(d->comment), true);
|
sizeof(d->comment), true);
|
||||||
|
|
||||||
|
if (!memcmp(d->comment, WIL_FW_VERSION_PREFIX,
|
||||||
|
WIL_FW_VERSION_PREFIX_LEN))
|
||||||
|
memcpy(wil->fw_version,
|
||||||
|
d->comment + WIL_FW_VERSION_PREFIX_LEN,
|
||||||
|
min(sizeof(d->comment) - WIL_FW_VERSION_PREFIX_LEN,
|
||||||
|
sizeof(wil->fw_version) - 1));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -892,6 +892,7 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
|
||||||
WIL_FW2_NAME);
|
WIL_FW2_NAME);
|
||||||
|
|
||||||
wil_halt_cpu(wil);
|
wil_halt_cpu(wil);
|
||||||
|
memset(wil->fw_version, 0, sizeof(wil->fw_version));
|
||||||
/* Loading f/w from the file */
|
/* Loading f/w from the file */
|
||||||
rc = wil_request_firmware(wil, WIL_FW_NAME, true);
|
rc = wil_request_firmware(wil, WIL_FW_NAME, true);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
|
|
@ -222,6 +222,8 @@ int wil_if_add(struct wil6210_priv *wil)
|
||||||
|
|
||||||
wil_dbg_misc(wil, "entered");
|
wil_dbg_misc(wil, "entered");
|
||||||
|
|
||||||
|
strlcpy(wiphy->fw_version, wil->fw_version, sizeof(wiphy->fw_version));
|
||||||
|
|
||||||
rc = wiphy_register(wiphy);
|
rc = wiphy_register(wiphy);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
wil_err(wil, "failed to register wiphy, err %d\n", rc);
|
wil_err(wil, "failed to register wiphy, err %d\n", rc);
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#ifndef __WIL6210_H__
|
#ifndef __WIL6210_H__
|
||||||
#define __WIL6210_H__
|
#define __WIL6210_H__
|
||||||
|
|
||||||
|
#include <linux/etherdevice.h>
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
#include <linux/wireless.h>
|
#include <linux/wireless.h>
|
||||||
#include <net/cfg80211.h>
|
#include <net/cfg80211.h>
|
||||||
|
@ -579,7 +580,7 @@ struct wil6210_priv {
|
||||||
struct wireless_dev *wdev;
|
struct wireless_dev *wdev;
|
||||||
void __iomem *csr;
|
void __iomem *csr;
|
||||||
DECLARE_BITMAP(status, wil_status_last);
|
DECLARE_BITMAP(status, wil_status_last);
|
||||||
u32 fw_version;
|
u8 fw_version[ETHTOOL_FWVERS_LEN];
|
||||||
u32 hw_version;
|
u32 hw_version;
|
||||||
const char *hw_name;
|
const char *hw_name;
|
||||||
DECLARE_BITMAP(hw_capabilities, hw_capability_last);
|
DECLARE_BITMAP(hw_capabilities, hw_capability_last);
|
||||||
|
|
|
@ -312,14 +312,14 @@ static void wmi_evt_ready(struct wil6210_priv *wil, int id, void *d, int len)
|
||||||
struct wireless_dev *wdev = wil->wdev;
|
struct wireless_dev *wdev = wil->wdev;
|
||||||
struct wmi_ready_event *evt = d;
|
struct wmi_ready_event *evt = d;
|
||||||
|
|
||||||
wil->fw_version = le32_to_cpu(evt->sw_version);
|
|
||||||
wil->n_mids = evt->numof_additional_mids;
|
wil->n_mids = evt->numof_additional_mids;
|
||||||
|
|
||||||
wil_info(wil, "FW ver. %d; MAC %pM; %d MID's\n", wil->fw_version,
|
wil_info(wil, "FW ver. %s(SW %d); MAC %pM; %d MID's\n",
|
||||||
|
wil->fw_version, le32_to_cpu(evt->sw_version),
|
||||||
evt->mac, wil->n_mids);
|
evt->mac, wil->n_mids);
|
||||||
/* ignore MAC address, we already have it from the boot loader */
|
/* ignore MAC address, we already have it from the boot loader */
|
||||||
snprintf(wdev->wiphy->fw_version, sizeof(wdev->wiphy->fw_version),
|
strlcpy(wdev->wiphy->fw_version, wil->fw_version,
|
||||||
"%d", wil->fw_version);
|
sizeof(wdev->wiphy->fw_version));
|
||||||
|
|
||||||
wil_set_recovery_state(wil, fw_recovery_idle);
|
wil_set_recovery_state(wil, fw_recovery_idle);
|
||||||
set_bit(wil_status_fwready, wil->status);
|
set_bit(wil_status_fwready, wil->status);
|
||||||
|
|
Loading…
Add table
Reference in a new issue