@@ -1471,6 +1471,34 @@ int ath11k_wmi_send_stats_request_cmd(struct ath11k *ar,
14711471 return ret ;
14721472}
14731473
1474+ int ath11k_wmi_send_pdev_temperature_cmd (struct ath11k * ar )
1475+ {
1476+ struct ath11k_pdev_wmi * wmi = ar -> wmi ;
1477+ struct wmi_get_pdev_temperature_cmd * cmd ;
1478+ struct sk_buff * skb ;
1479+ int ret ;
1480+
1481+ skb = ath11k_wmi_alloc_skb (wmi -> wmi_ab , sizeof (* cmd ));
1482+ if (!skb )
1483+ return - ENOMEM ;
1484+
1485+ cmd = (struct wmi_get_pdev_temperature_cmd * )skb -> data ;
1486+ cmd -> tlv_header = FIELD_PREP (WMI_TLV_TAG , WMI_TAG_PDEV_GET_TEMPERATURE_CMD ) |
1487+ FIELD_PREP (WMI_TLV_LEN , sizeof (* cmd ) - TLV_HDR_SIZE );
1488+ cmd -> pdev_id = ar -> pdev -> pdev_id ;
1489+
1490+ ret = ath11k_wmi_cmd_send (wmi , skb , WMI_PDEV_GET_TEMPERATURE_CMDID );
1491+ if (ret ) {
1492+ ath11k_warn (ar -> ab , "failed to send WMI_PDEV_GET_TEMPERATURE cmd\n" );
1493+ dev_kfree_skb (skb );
1494+ }
1495+
1496+ ath11k_dbg (ar -> ab , ATH11K_DBG_WMI ,
1497+ "WMI pdev get temperature for pdev_id %d\n" , ar -> pdev -> pdev_id );
1498+
1499+ return ret ;
1500+ }
1501+
14741502int ath11k_wmi_send_bcn_offload_control_cmd (struct ath11k * ar ,
14751503 u32 vdev_id , u32 bcn_ctrl_op )
14761504{
@@ -4232,6 +4260,31 @@ int ath11k_wmi_pull_fw_stats(struct ath11k_base *ab, struct sk_buff *skb,
42324260 return 0 ;
42334261}
42344262
4263+ static int
4264+ ath11k_pull_pdev_temp_ev (struct ath11k_base * ab , u8 * evt_buf ,
4265+ u32 len , const struct wmi_pdev_temperature_event * ev )
4266+ {
4267+ const void * * tb ;
4268+ int ret ;
4269+
4270+ tb = ath11k_wmi_tlv_parse_alloc (ab , evt_buf , len , GFP_ATOMIC );
4271+ if (IS_ERR (tb )) {
4272+ ret = PTR_ERR (tb );
4273+ ath11k_warn (ab , "failed to parse tlv: %d\n" , ret );
4274+ return ret ;
4275+ }
4276+
4277+ ev = tb [WMI_TAG_PDEV_TEMPERATURE_EVENT ];
4278+ if (!ev ) {
4279+ ath11k_warn (ab , "failed to fetch pdev temp ev" );
4280+ kfree (tb );
4281+ return - EPROTO ;
4282+ }
4283+
4284+ kfree (tb );
4285+ return 0 ;
4286+ }
4287+
42354288size_t ath11k_wmi_fw_stats_num_vdevs (struct list_head * head )
42364289{
42374290 struct ath11k_fw_stats_vdev * i ;
@@ -5578,6 +5631,30 @@ ath11k_wmi_pdev_dfs_radar_detected_event(struct ath11k_base *ab, struct sk_buff
55785631 kfree (tb );
55795632}
55805633
5634+ static void
5635+ ath11k_wmi_pdev_temperature_event (struct ath11k_base * ab ,
5636+ struct sk_buff * skb )
5637+ {
5638+ struct ath11k * ar ;
5639+ struct wmi_pdev_temperature_event ev = {0 };
5640+
5641+ if (ath11k_pull_pdev_temp_ev (ab , skb -> data , skb -> len , & ev ) != 0 ) {
5642+ ath11k_warn (ab , "failed to extract pdev temperature event" );
5643+ return ;
5644+ }
5645+
5646+ ath11k_dbg (ab , ATH11K_DBG_WMI ,
5647+ "pdev temperature ev temp %d pdev_id %d\n" , ev .temp , ev .pdev_id );
5648+
5649+ ar = ath11k_mac_get_ar_by_pdev_id (ab , ev .pdev_id );
5650+ if (!ar ) {
5651+ ath11k_warn (ab , "invalid pdev id in pdev temperature ev %d" , ev .pdev_id );
5652+ return ;
5653+ }
5654+
5655+ ath11k_thermal_event_temperature (ar , ev .temp );
5656+ }
5657+
55815658static void ath11k_wmi_tlv_op_rx (struct ath11k_base * ab , struct sk_buff * skb )
55825659{
55835660 struct wmi_cmd_hdr * cmd_hdr ;
@@ -5655,6 +5732,9 @@ static void ath11k_wmi_tlv_op_rx(struct ath11k_base *ab, struct sk_buff *skb)
56555732 case WMI_PDEV_CSA_SWITCH_COUNT_STATUS_EVENTID :
56565733 ath11k_wmi_pdev_csa_switch_count_status_event (ab , skb );
56575734 break ;
5735+ case WMI_PDEV_TEMPERATURE_EVENTID :
5736+ ath11k_wmi_pdev_temperature_event (ab , skb );
5737+ break ;
56585738 /* add Unsupported events here */
56595739 case WMI_TBTTOFFSET_EXT_UPDATE_EVENTID :
56605740 case WMI_VDEV_DELETE_RESP_EVENTID :
0 commit comments