Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5cc565a6 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "wil6210: add sysfs for thermal throttling configuration" into msm-4.9

parents 73eb7acf 1b75271b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1023,6 +1023,9 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
			return rc;
		}

		if (wil->tt_data_set)
			wmi_set_tt_cfg(wil, &wil->tt_data);

		wil_collect_fw_info(wil);

		if (wil->platform_ops.notify) {
+111 −0
Original line number Diff line number Diff line
@@ -94,8 +94,119 @@ static DEVICE_ATTR(ftm_txrx_offset, 0644,
		   wil_ftm_txrx_offset_sysfs_show,
		   wil_ftm_txrx_offset_sysfs_store);

static ssize_t
wil_tt_sysfs_show(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct wil6210_priv *wil = dev_get_drvdata(dev);
	ssize_t len;
	struct wmi_tt_data tt_data;
	int i, rc;

	rc = wmi_get_tt_cfg(wil, &tt_data);
	if (rc)
		return rc;

	len = snprintf(buf, PAGE_SIZE, "    high      max       critical\n");

	len += snprintf(buf + len, PAGE_SIZE - len, "bb: ");
	if (tt_data.bb_enabled)
		for (i = 0; i < WMI_NUM_OF_TT_ZONES; ++i)
			len += snprintf(buf + len, PAGE_SIZE - len,
					"%03d-%03d   ",
					tt_data.bb_zones[i].temperature_high,
					tt_data.bb_zones[i].temperature_low);
	else
		len += snprintf(buf + len, PAGE_SIZE - len, "* disabled *");
	len += snprintf(buf + len, PAGE_SIZE - len, "\nrf: ");
	if (tt_data.rf_enabled)
		for (i = 0; i < WMI_NUM_OF_TT_ZONES; ++i)
			len += snprintf(buf + len, PAGE_SIZE - len,
					"%03d-%03d   ",
					tt_data.rf_zones[i].temperature_high,
					tt_data.rf_zones[i].temperature_low);
	else
		len += snprintf(buf + len, PAGE_SIZE - len, "* disabled *");
	len += snprintf(buf + len, PAGE_SIZE - len, "\n");

	return len;
}

static ssize_t
wil_tt_sysfs_store(struct device *dev, struct device_attribute *attr,
		   const char *buf, size_t count)
{
	struct wil6210_priv *wil = dev_get_drvdata(dev);
	int i, rc = -EINVAL;
	char *token, *dupbuf, *tmp;
	struct wmi_tt_data tt_data = {
		.bb_enabled = 0,
		.rf_enabled = 0,
	};

	tmp = kmemdup(buf, count + 1, GFP_KERNEL);
	if (!tmp)
		return -ENOMEM;
	tmp[count] = '\0';
	dupbuf = tmp;

	/* Format for writing is 12 unsigned bytes separated by spaces:
	 * <bb_z1_h> <bb_z1_l> <bb_z2_h> <bb_z2_l> <bb_z3_h> <bb_z3_l> \
	 * <rf_z1_h> <rf_z1_l> <rf_z2_h> <rf_z2_l> <rf_z3_h> <rf_z3_l>
	 * To disable thermal throttling for bb or for rf, use 0 for all
	 * its six set points.
	 */

	/* bb */
	for (i = 0; i < WMI_NUM_OF_TT_ZONES; ++i) {
		token = strsep(&dupbuf, " ");
		if (!token)
			goto out;
		if (kstrtou8(token, 0, &tt_data.bb_zones[i].temperature_high))
			goto out;
		token = strsep(&dupbuf, " ");
		if (!token)
			goto out;
		if (kstrtou8(token, 0, &tt_data.bb_zones[i].temperature_low))
			goto out;

		if (tt_data.bb_zones[i].temperature_high > 0 ||
		    tt_data.bb_zones[i].temperature_low > 0)
			tt_data.bb_enabled = 1;
	}
	/* rf */
	for (i = 0; i < WMI_NUM_OF_TT_ZONES; ++i) {
		token = strsep(&dupbuf, " ");
		if (!token)
			goto out;
		if (kstrtou8(token, 0, &tt_data.rf_zones[i].temperature_high))
			goto out;
		token = strsep(&dupbuf, " ");
		if (!token)
			goto out;
		if (kstrtou8(token, 0, &tt_data.rf_zones[i].temperature_low))
			goto out;

		if (tt_data.rf_zones[i].temperature_high > 0 ||
		    tt_data.rf_zones[i].temperature_low > 0)
			tt_data.rf_enabled = 1;
	}

	rc = wmi_set_tt_cfg(wil, &tt_data);
	if (rc)
		goto out;

	rc = count;
out:
	kfree(tmp);
	return rc;
}

static DEVICE_ATTR(thermal_throttling, 0644,
		   wil_tt_sysfs_show, wil_tt_sysfs_store);

static struct attribute *wil6210_sysfs_entries[] = {
	&dev_attr_ftm_txrx_offset.attr,
	&dev_attr_thermal_throttling.attr,
	NULL
};

+4 −0
Original line number Diff line number Diff line
@@ -697,6 +697,8 @@ struct wil6210_priv {
	struct wil_halp halp;

	struct wil_ftm_priv ftm;
	bool tt_data_set;
	struct wmi_tt_data tt_data;

#ifdef CONFIG_PM
#ifdef CONFIG_PM_SLEEP
@@ -861,6 +863,8 @@ int wmi_ps_dev_profile_cfg(struct wil6210_priv *wil,
int wmi_set_mgmt_retry(struct wil6210_priv *wil, u8 retry_short);
int wmi_get_mgmt_retry(struct wil6210_priv *wil, u8 *retry_short);
int wmi_new_sta(struct wil6210_priv *wil, const u8 *mac, u8 aid);
int wmi_set_tt_cfg(struct wil6210_priv *wil, struct wmi_tt_data *tt_data);
int wmi_get_tt_cfg(struct wil6210_priv *wil, struct wmi_tt_data *tt_data);
int wil_addba_rx_request(struct wil6210_priv *wil, u8 cidxtid,
			 u8 dialog_token, __le16 ba_param_set,
			 __le16 ba_timeout, __le16 ba_seq_ctrl);
+61 −0
Original line number Diff line number Diff line
@@ -1769,6 +1769,67 @@ int wmi_new_sta(struct wil6210_priv *wil, const u8 *mac, u8 aid)
	return rc;
}

int wmi_set_tt_cfg(struct wil6210_priv *wil, struct wmi_tt_data *tt_data)
{
	int rc;
	struct wmi_set_thermal_throttling_cfg_cmd cmd = {
		.tt_data = *tt_data,
	};
	struct {
		struct wmi_cmd_hdr wmi;
		struct wmi_set_thermal_throttling_cfg_event evt;
	} __packed reply;

	if (!test_bit(WMI_FW_CAPABILITY_THERMAL_THROTTLING,
		      wil->fw_capabilities))
		return -EOPNOTSUPP;

	memset(&reply, 0, sizeof(reply));
	rc = wmi_call(wil, WMI_SET_THERMAL_THROTTLING_CFG_CMDID, &cmd,
		      sizeof(cmd), WMI_SET_THERMAL_THROTTLING_CFG_EVENTID,
		      &reply, sizeof(reply), 100);
	if (rc) {
		wil_err(wil, "failed to set thermal throttling\n");
		return rc;
	}
	if (reply.evt.status) {
		wil_err(wil, "set thermal throttling failed, error %d\n",
			reply.evt.status);
		return -EIO;
	}

	wil->tt_data = *tt_data;
	wil->tt_data_set = true;

	return 0;
}

int wmi_get_tt_cfg(struct wil6210_priv *wil, struct wmi_tt_data *tt_data)
{
	int rc;
	struct {
		struct wmi_cmd_hdr wmi;
		struct wmi_get_thermal_throttling_cfg_event evt;
	} __packed reply;

	if (!test_bit(WMI_FW_CAPABILITY_THERMAL_THROTTLING,
		      wil->fw_capabilities))
		return -EOPNOTSUPP;

	rc = wmi_call(wil, WMI_GET_THERMAL_THROTTLING_CFG_CMDID, NULL, 0,
		      WMI_GET_THERMAL_THROTTLING_CFG_EVENTID, &reply,
		      sizeof(reply), 100);
	if (rc) {
		wil_err(wil, "failed to get thermal throttling\n");
		return rc;
	}

	if (tt_data)
		*tt_data = reply.evt.tt_data;

	return 0;
}

void wmi_event_flush(struct wil6210_priv *wil)
{
	ulong flags;