wil6210: add support for reading multiple RFs temperature via debugfs

Base-band chips support multi RFs chips. Add support for reading
multiple RFs temperature via debugfs.

Signed-off-by: Tzahi Sabo <stzahi@codeaurora.org>
Signed-off-by: Maya Erez <merez@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
Tzahi Sabo 2019-06-16 10:26:05 +03:00 committed by Kalle Valo
parent 3e7ee09d36
commit 9b58611873
4 changed files with 118 additions and 18 deletions

View File

@ -1336,7 +1336,7 @@ static void print_temp(struct seq_file *s, const char *prefix, s32 t)
{
switch (t) {
case 0:
case ~(u32)0:
case WMI_INVALID_TEMPERATURE:
seq_printf(s, "%s N/A\n", prefix);
break;
default:
@ -1349,17 +1349,41 @@ static void print_temp(struct seq_file *s, const char *prefix, s32 t)
static int temp_show(struct seq_file *s, void *data)
{
struct wil6210_priv *wil = s->private;
s32 t_m, t_r;
int rc = wmi_get_temperature(wil, &t_m, &t_r);
int rc, i;
if (rc) {
seq_puts(s, "Failed\n");
return 0;
if (test_bit(WMI_FW_CAPABILITY_TEMPERATURE_ALL_RF,
wil->fw_capabilities)) {
struct wmi_temp_sense_all_done_event sense_all_evt;
wil_dbg_misc(wil,
"WMI_FW_CAPABILITY_TEMPERATURE_ALL_RF is supported");
rc = wmi_get_all_temperatures(wil, &sense_all_evt);
if (rc) {
seq_puts(s, "Failed\n");
return 0;
}
print_temp(s, "T_mac =",
le32_to_cpu(sense_all_evt.baseband_t1000));
seq_printf(s, "Connected RFs [0x%08x]\n",
sense_all_evt.rf_bitmap);
for (i = 0; i < WMI_MAX_XIF_PORTS_NUM; i++) {
seq_printf(s, "RF[%d] = ", i);
print_temp(s, "",
le32_to_cpu(sense_all_evt.rf_t1000[i]));
}
} else {
s32 t_m, t_r;
wil_dbg_misc(wil,
"WMI_FW_CAPABILITY_TEMPERATURE_ALL_RF is not supported");
rc = wmi_get_temperature(wil, &t_m, &t_r);
if (rc) {
seq_puts(s, "Failed\n");
return 0;
}
print_temp(s, "T_mac =", t_m);
print_temp(s, "T_radio =", t_r);
}
print_temp(s, "T_mac =", t_m);
print_temp(s, "T_radio =", t_r);
return 0;
}
DEFINE_SHOW_ATTRIBUTE(temp);

View File

@ -1252,6 +1252,9 @@ int wmi_rx_chain_add(struct wil6210_priv *wil, struct wil_ring *vring);
int wmi_update_ft_ies(struct wil6210_vif *vif, u16 ie_len, const void *ie);
int wmi_rxon(struct wil6210_priv *wil, bool on);
int wmi_get_temperature(struct wil6210_priv *wil, u32 *t_m, u32 *t_r);
int wmi_get_all_temperatures(struct wil6210_priv *wil,
struct wmi_temp_sense_all_done_event
*sense_all_evt);
int wmi_disconnect_sta(struct wil6210_vif *vif, const u8 *mac, u16 reason,
bool del_sta);
int wmi_addba(struct wil6210_priv *wil, u8 mid,

View File

@ -486,6 +486,8 @@ static const char *cmdid2name(u16 cmdid)
return "WMI_UPDATE_FT_IES_CMD";
case WMI_RBUFCAP_CFG_CMDID:
return "WMI_RBUFCAP_CFG_CMD";
case WMI_TEMP_SENSE_ALL_CMDID:
return "WMI_TEMP_SENSE_ALL_CMDID";
default:
return "Untracked CMD";
}
@ -632,6 +634,8 @@ static const char *eventid2name(u16 eventid)
return "WMI_FT_REASSOC_STATUS_EVENT";
case WMI_RBUFCAP_CFG_EVENTID:
return "WMI_RBUFCAP_CFG_EVENT";
case WMI_TEMP_SENSE_ALL_DONE_EVENTID:
return "WMI_TEMP_SENSE_ALL_DONE_EVENTID";
default:
return "Untracked EVENT";
}
@ -2648,6 +2652,44 @@ int wmi_get_temperature(struct wil6210_priv *wil, u32 *t_bb, u32 *t_rf)
return 0;
}
int wmi_get_all_temperatures(struct wil6210_priv *wil,
struct wmi_temp_sense_all_done_event
*sense_all_evt)
{
struct wil6210_vif *vif = ndev_to_vif(wil->main_ndev);
int rc;
struct wmi_temp_sense_all_cmd cmd = {
.measure_baseband_en = true,
.measure_rf_en = true,
.measure_mode = TEMPERATURE_MEASURE_NOW,
};
struct {
struct wmi_cmd_hdr wmi;
struct wmi_temp_sense_all_done_event evt;
} __packed reply;
if (!sense_all_evt) {
wil_err(wil, "Invalid sense_all_evt value\n");
return -EINVAL;
}
memset(&reply, 0, sizeof(reply));
reply.evt.status = WMI_FW_STATUS_FAILURE;
rc = wmi_call(wil, WMI_TEMP_SENSE_ALL_CMDID, vif->mid, &cmd,
sizeof(cmd), WMI_TEMP_SENSE_ALL_DONE_EVENTID,
&reply, sizeof(reply), WIL_WMI_CALL_GENERAL_TO_MS);
if (rc)
return rc;
if (reply.evt.status == WMI_FW_STATUS_FAILURE) {
wil_err(wil, "Failed geting TEMP_SENSE_ALL\n");
return -EINVAL;
}
memcpy(sense_all_evt, &reply.evt, sizeof(reply.evt));
return 0;
}
int wmi_disconnect_sta(struct wil6210_vif *vif, const u8 *mac, u16 reason,
bool del_sta)
{

View File

@ -35,6 +35,7 @@
#define WMI_PROX_RANGE_NUM (3)
#define WMI_MAX_LOSS_DMG_BEACONS (20)
#define MAX_NUM_OF_SECTORS (128)
#define WMI_INVALID_TEMPERATURE (0xFFFFFFFF)
#define WMI_SCHED_MAX_ALLOCS_PER_CMD (4)
#define WMI_RF_DTYPE_LENGTH (3)
#define WMI_RF_ETYPE_LENGTH (3)
@ -64,6 +65,7 @@
#define WMI_QOS_MAX_WEIGHT 50
#define WMI_QOS_SET_VIF_PRIORITY (0xFF)
#define WMI_QOS_DEFAULT_PRIORITY (WMI_QOS_NUM_OF_PRIORITY)
#define WMI_MAX_XIF_PORTS_NUM (8)
/* Mailbox interface
* used for commands and events
@ -105,6 +107,7 @@ enum wmi_fw_capability {
WMI_FW_CAPABILITY_TX_REQ_EXT = 25,
WMI_FW_CAPABILITY_CHANNEL_4 = 26,
WMI_FW_CAPABILITY_IPA = 27,
WMI_FW_CAPABILITY_TEMPERATURE_ALL_RF = 30,
WMI_FW_CAPABILITY_MAX,
};
@ -296,6 +299,7 @@ enum wmi_command_id {
WMI_SET_VRING_PRIORITY_WEIGHT_CMDID = 0xA10,
WMI_SET_VRING_PRIORITY_CMDID = 0xA11,
WMI_RBUFCAP_CFG_CMDID = 0xA12,
WMI_TEMP_SENSE_ALL_CMDID = 0xA13,
WMI_SET_MAC_ADDRESS_CMDID = 0xF003,
WMI_ABORT_SCAN_CMDID = 0xF007,
WMI_SET_PROMISCUOUS_MODE_CMDID = 0xF041,
@ -1411,12 +1415,7 @@ struct wmi_rf_xpm_write_cmd {
u8 data_bytes[0];
} __packed;
/* WMI_TEMP_SENSE_CMDID
*
* Measure MAC and radio temperatures
*
* Possible modes for temperature measurement
*/
/* Possible modes for temperature measurement */
enum wmi_temperature_measure_mode {
TEMPERATURE_USE_OLD_VALUE = 0x01,
TEMPERATURE_MEASURE_NOW = 0x02,
@ -1942,6 +1941,14 @@ struct wmi_set_ap_slot_size_cmd {
__le32 slot_size;
} __packed;
/* WMI_TEMP_SENSE_ALL_CMDID */
struct wmi_temp_sense_all_cmd {
u8 measure_baseband_en;
u8 measure_rf_en;
u8 measure_mode;
u8 reserved;
} __packed;
/* WMI Events
* List of Events (target to host)
*/
@ -2101,6 +2108,7 @@ enum wmi_event_id {
WMI_SET_VRING_PRIORITY_WEIGHT_EVENTID = 0x1A10,
WMI_SET_VRING_PRIORITY_EVENTID = 0x1A11,
WMI_RBUFCAP_CFG_EVENTID = 0x1A12,
WMI_TEMP_SENSE_ALL_DONE_EVENTID = 0x1A13,
WMI_SET_CHANNEL_EVENTID = 0x9000,
WMI_ASSOC_REQ_EVENTID = 0x9001,
WMI_EAPOL_RX_EVENTID = 0x9002,
@ -2784,11 +2792,13 @@ struct wmi_fixed_scheduling_ul_config_event {
*/
struct wmi_temp_sense_done_event {
/* Temperature times 1000 (actual temperature will be achieved by
* dividing the value by 1000)
* dividing the value by 1000). When temperature cannot be read from
* device return WMI_INVALID_TEMPERATURE
*/
__le32 baseband_t1000;
/* Temperature times 1000 (actual temperature will be achieved by
* dividing the value by 1000)
* dividing the value by 1000). When temperature cannot be read from
* device return WMI_INVALID_TEMPERATURE
*/
__le32 rf_t1000;
} __packed;
@ -4140,4 +4150,25 @@ struct wmi_rbufcap_cfg_event {
u8 reserved[3];
} __packed;
/* WMI_TEMP_SENSE_ALL_DONE_EVENTID
* Measure MAC and all radio temperatures
*/
struct wmi_temp_sense_all_done_event {
/* enum wmi_fw_status */
u8 status;
/* Bitmap of connected RFs */
u8 rf_bitmap;
u8 reserved[2];
/* Temperature times 1000 (actual temperature will be achieved by
* dividing the value by 1000). When temperature cannot be read from
* device return WMI_INVALID_TEMPERATURE
*/
__le32 rf_t1000[WMI_MAX_XIF_PORTS_NUM];
/* Temperature times 1000 (actual temperature will be achieved by
* dividing the value by 1000). When temperature cannot be read from
* device return WMI_INVALID_TEMPERATURE
*/
__le32 baseband_t1000;
} __packed;
#endif /* __WILOCITY_WMI_H__ */