Skip to content
This repository has been archived by the owner on May 2, 2024. It is now read-only.

Commit

Permalink
ath10k: skip sending quiet mode cmd for WCN3990
Browse files Browse the repository at this point in the history
HL2.0 firmware does not support setting quiet mode.  If the host driver sends
the quiet mode setting command to the HL2.0 firmware, it crashes with the below
signature.

fatal error received: err_qdi.c:456:EX:wlan_process:1:WLAN RT:207a:PC=b001b4f0

The quiet mode command support is exposed by the firmware via thermal throttle
wmi service. Enable ath10k thermal support if thermal throttle wmi service bit
is set.  10.x firmware versions support this feature by default, but
unfortunately do not advertise the support via service flags, hence have to
manually set the service flag in ath10k_core_compat_services().

Tested on QCA988X with 10.2.4.70.9-2. Also tested on WCN3990.

Co-developed-by: Govind Singh <[email protected]>
Co-developed-by: Kalle Valo <[email protected]>
Signed-off-by: Rakesh Pillai <[email protected]>
Signed-off-by: Govind Singh <[email protected]>
Signed-off-by: Kalle Valo <[email protected]>
  • Loading branch information
Rakesh Pillai authored and Kalle Valo committed Dec 19, 2018
1 parent eca1e56 commit 5388457
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 2 deletions.
28 changes: 28 additions & 0 deletions drivers/net/wireless/ath/ath10k/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -2418,6 +2418,28 @@ static int ath10k_core_reset_rx_filter(struct ath10k *ar)
return 0;
}

static int ath10k_core_compat_services(struct ath10k *ar)
{
struct ath10k_fw_file *fw_file = &ar->normal_mode_fw.fw_file;

/* all 10.x firmware versions support thermal throttling but don't
* advertise the support via service flags so we have to hardcode
* it here
*/
switch (fw_file->wmi_op_version) {
case ATH10K_FW_WMI_OP_VERSION_10_1:
case ATH10K_FW_WMI_OP_VERSION_10_2:
case ATH10K_FW_WMI_OP_VERSION_10_2_4:
case ATH10K_FW_WMI_OP_VERSION_10_4:
set_bit(WMI_SERVICE_THERM_THROT, ar->wmi.svc_map);
break;
default:
break;
}

return 0;
}

int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode,
const struct ath10k_fw_components *fw)
{
Expand Down Expand Up @@ -2617,6 +2639,12 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode,
goto err_hif_stop;
}

status = ath10k_core_compat_services(ar);
if (status) {
ath10k_err(ar, "compat services failed: %d\n", status);
goto err_hif_stop;
}

/* Some firmware revisions do not properly set up hardware rx filter
* registers.
*
Expand Down
5 changes: 3 additions & 2 deletions drivers/net/wireless/ath/ath10k/debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -2578,8 +2578,9 @@ int ath10k_debug_register(struct ath10k *ar)
debugfs_create_file("pktlog_filter", 0644, ar->debug.debugfs_phy, ar,
&fops_pktlog_filter);

debugfs_create_file("quiet_period", 0644, ar->debug.debugfs_phy, ar,
&fops_quiet_period);
if (test_bit(WMI_SERVICE_THERM_THROT, ar->wmi.svc_map))
debugfs_create_file("quiet_period", 0644, ar->debug.debugfs_phy, ar,
&fops_quiet_period);

debugfs_create_file("tpc_stats", 0400, ar->debug.debugfs_phy, ar,
&fops_tpc_stats);
Expand Down
9 changes: 9 additions & 0 deletions drivers/net/wireless/ath/ath10k/thermal.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,9 @@ void ath10k_thermal_set_throttling(struct ath10k *ar)

lockdep_assert_held(&ar->conf_mutex);

if (!test_bit(WMI_SERVICE_THERM_THROT, ar->wmi.svc_map))
return;

if (!ar->wmi.ops->gen_pdev_set_quiet_mode)
return;

Expand All @@ -165,6 +168,9 @@ int ath10k_thermal_register(struct ath10k *ar)
struct device *hwmon_dev;
int ret;

if (!test_bit(WMI_SERVICE_THERM_THROT, ar->wmi.svc_map))
return 0;

cdev = thermal_cooling_device_register("ath10k_thermal", ar,
&ath10k_thermal_ops);

Expand Down Expand Up @@ -216,6 +222,9 @@ int ath10k_thermal_register(struct ath10k *ar)

void ath10k_thermal_unregister(struct ath10k *ar)
{
if (!test_bit(WMI_SERVICE_THERM_THROT, ar->wmi.svc_map))
return;

sysfs_remove_link(&ar->dev->kobj, "cooling_device");
thermal_cooling_device_unregister(ar->thermal.cdev);
}
3 changes: 3 additions & 0 deletions drivers/net/wireless/ath/ath10k/wmi-tlv.h
Original file line number Diff line number Diff line change
Expand Up @@ -1564,6 +1564,9 @@ wmi_tlv_svc_map_ext(const __le32 *in, unsigned long *out, size_t len)
SVCMAP(WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT,
WMI_SERVICE_SPOOF_MAC_SUPPORT,
WMI_TLV_MAX_SERVICE);
SVCMAP(WMI_TLV_SERVICE_THERM_THROT,
WMI_SERVICE_THERM_THROT,
WMI_TLV_MAX_SERVICE);
}

#undef SVCMAP
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/ath/ath10k/wmi.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ enum wmi_service {
WMI_SERVICE_SPOOF_MAC_SUPPORT,
WMI_SERVICE_TX_DATA_ACK_RSSI,
WMI_SERVICE_VDEV_DIFFERENT_BEACON_INTERVAL_SUPPORT,
WMI_SERVICE_THERM_THROT,

/* keep last */
WMI_SERVICE_MAX,
Expand Down

0 comments on commit 5388457

Please sign in to comment.