Merge "wil6210: refresh FW capabilities during interface up"

This commit is contained in:
Linux Build Service Account 2017-09-18 01:31:44 -07:00 committed by Gerrit - the friendly Code Review server
commit 6f777b2385
4 changed files with 34 additions and 28 deletions

View file

@ -124,24 +124,19 @@ static int fw_ignore_section(struct wil6210_priv *wil, const void *data,
return 0; return 0;
} }
static int fw_handle_comment(struct wil6210_priv *wil, const void *data,
size_t size)
{
wil_hex_dump_fw("", DUMP_PREFIX_OFFSET, 16, 1, data, size, true);
return 0;
}
static int static int
fw_handle_capabilities(struct wil6210_priv *wil, const void *data, fw_handle_comment(struct wil6210_priv *wil, const void *data,
size_t size) size_t size)
{ {
const struct wil_fw_record_capabilities *rec = data; const struct wil_fw_record_capabilities *rec = data;
size_t capa_size; size_t capa_size;
if (size < sizeof(*rec) || if (size < sizeof(*rec) ||
le32_to_cpu(rec->magic) != WIL_FW_CAPABILITIES_MAGIC) le32_to_cpu(rec->magic) != WIL_FW_CAPABILITIES_MAGIC) {
wil_hex_dump_fw("", DUMP_PREFIX_OFFSET, 16, 1,
data, size, true);
return 0; return 0;
}
capa_size = size - offsetof(struct wil_fw_record_capabilities, capa_size = size - offsetof(struct wil_fw_record_capabilities,
capabilities); capabilities);
@ -422,7 +417,7 @@ static const struct {
int (*parse_handler)(struct wil6210_priv *wil, const void *data, int (*parse_handler)(struct wil6210_priv *wil, const void *data,
size_t size); size_t size);
} wil_fw_handlers[] = { } wil_fw_handlers[] = {
{wil_fw_type_comment, fw_handle_comment, fw_handle_capabilities}, {wil_fw_type_comment, fw_handle_comment, fw_handle_comment},
{wil_fw_type_data, fw_handle_data, fw_ignore_section}, {wil_fw_type_data, fw_handle_data, fw_ignore_section},
{wil_fw_type_fill, fw_handle_fill, fw_ignore_section}, {wil_fw_type_fill, fw_handle_fill, fw_ignore_section},
/* wil_fw_type_action */ /* wil_fw_type_action */
@ -517,7 +512,7 @@ int wil_request_firmware(struct wil6210_priv *wil, const char *name,
rc = request_firmware(&fw, name, wil_to_dev(wil)); rc = request_firmware(&fw, name, wil_to_dev(wil));
if (rc) { if (rc) {
wil_err_fw(wil, "Failed to load firmware %s\n", name); wil_err_fw(wil, "Failed to load firmware %s rc %d\n", name, rc);
return rc; return rc;
} }
wil_dbg_fw(wil, "Loading <%s>, %zu bytes\n", name, fw->size); wil_dbg_fw(wil, "Loading <%s>, %zu bytes\n", name, fw->size);

View file

@ -765,6 +765,8 @@ static void wil_collect_fw_info(struct wil6210_priv *wil)
u8 retry_short; u8 retry_short;
int rc; int rc;
wil_refresh_fw_capabilities(wil);
rc = wmi_get_mgmt_retry(wil, &retry_short); rc = wmi_get_mgmt_retry(wil, &retry_short);
if (!rc) { if (!rc) {
wiphy->retry_short = retry_short; wiphy->retry_short = retry_short;
@ -772,6 +774,25 @@ static void wil_collect_fw_info(struct wil6210_priv *wil)
} }
} }
void wil_refresh_fw_capabilities(struct wil6210_priv *wil)
{
struct wiphy *wiphy = wil_to_wiphy(wil);
wil->keep_radio_on_during_sleep =
wil->platform_ops.keep_radio_on_during_sleep &&
wil->platform_ops.keep_radio_on_during_sleep(
wil->platform_handle) &&
test_bit(WMI_FW_CAPABILITY_D3_SUSPEND, wil->fw_capabilities);
wil_info(wil, "keep_radio_on_during_sleep (%d)\n",
wil->keep_radio_on_during_sleep);
if (test_bit(WMI_FW_CAPABILITY_RSSI_REPORTING, wil->fw_capabilities))
wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
else
wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC;
}
void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r) void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r)
{ {
le32_to_cpus(&r->base); le32_to_cpus(&r->base);
@ -1077,14 +1098,14 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
return rc; return rc;
} }
wil_collect_fw_info(wil);
if (wil->ps_profile != WMI_PS_PROFILE_TYPE_DEFAULT) if (wil->ps_profile != WMI_PS_PROFILE_TYPE_DEFAULT)
wil_ps_update(wil, wil->ps_profile); wil_ps_update(wil, wil->ps_profile);
if (wil->tt_data_set) if (wil->tt_data_set)
wmi_set_tt_cfg(wil, &wil->tt_data); wmi_set_tt_cfg(wil, &wil->tt_data);
wil_collect_fw_info(wil);
if (wil->platform_ops.notify) { if (wil->platform_ops.notify) {
rc = wil->platform_ops.notify(wil->platform_handle, rc = wil->platform_ops.notify(wil->platform_handle,
WIL_PLATFORM_EVT_FW_RDY); WIL_PLATFORM_EVT_FW_RDY);

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012-2016 Qualcomm Atheros, Inc. * Copyright (c) 2012-2017 Qualcomm Atheros, Inc.
* *
* Permission to use, copy, modify, and/or distribute this software for any * Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above * purpose with or without fee is hereby granted, provided that the above
@ -84,9 +84,7 @@ void wil_set_capabilities(struct wil6210_priv *wil)
/* extract FW capabilities from file without loading the FW */ /* extract FW capabilities from file without loading the FW */
wil_request_firmware(wil, wil->wil_fw_name, false); wil_request_firmware(wil, wil->wil_fw_name, false);
wil_refresh_fw_capabilities(wil);
if (test_bit(WMI_FW_CAPABILITY_RSSI_REPORTING, wil->fw_capabilities))
wil_to_wiphy(wil)->signal_type = CFG80211_SIGNAL_TYPE_MBM;
} }
void wil_disable_irq(struct wil6210_priv *wil) void wil_disable_irq(struct wil6210_priv *wil)
@ -289,15 +287,6 @@ static int wil_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
wil_set_capabilities(wil); wil_set_capabilities(wil);
wil6210_clear_irq(wil); wil6210_clear_irq(wil);
wil->keep_radio_on_during_sleep =
wil->platform_ops.keep_radio_on_during_sleep &&
wil->platform_ops.keep_radio_on_during_sleep(
wil->platform_handle) &&
test_bit(WMI_FW_CAPABILITY_D3_SUSPEND, wil->fw_capabilities);
wil_info(wil, "keep_radio_on_during_sleep (%d)\n",
wil->keep_radio_on_during_sleep);
/* FW should raise IRQ when ready */ /* FW should raise IRQ when ready */
rc = wil_if_pcie_enable(wil); rc = wil_if_pcie_enable(wil);
if (rc) { if (rc) {

View file

@ -873,6 +873,7 @@ int wil_up(struct wil6210_priv *wil);
int __wil_up(struct wil6210_priv *wil); int __wil_up(struct wil6210_priv *wil);
int wil_down(struct wil6210_priv *wil); int wil_down(struct wil6210_priv *wil);
int __wil_down(struct wil6210_priv *wil); int __wil_down(struct wil6210_priv *wil);
void wil_refresh_fw_capabilities(struct wil6210_priv *wil);
void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r); void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r);
int wil_find_cid(struct wil6210_priv *wil, const u8 *mac); int wil_find_cid(struct wil6210_priv *wil, const u8 *mac);
void wil_set_ethtoolops(struct net_device *ndev); void wil_set_ethtoolops(struct net_device *ndev);