Loading drivers/net/wireless/ath/wil6210/main.c +3 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading drivers/net/wireless/ath/wil6210/sysfs.c +111 −0 Original line number Diff line number Diff line Loading @@ -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 }; Loading drivers/net/wireless/ath/wil6210/wil6210.h +4 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading drivers/net/wireless/ath/wil6210/wmi.c +61 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
drivers/net/wireless/ath/wil6210/main.c +3 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading
drivers/net/wireless/ath/wil6210/sysfs.c +111 −0 Original line number Diff line number Diff line Loading @@ -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 }; Loading
drivers/net/wireless/ath/wil6210/wil6210.h +4 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading
drivers/net/wireless/ath/wil6210/wmi.c +61 −0 Original line number Diff line number Diff line Loading @@ -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; Loading