@@ -521,7 +521,8 @@ static struct wmi_cmd_map wmi_10_2_4_cmd_map = {
521521 .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED ,
522522 .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED ,
523523 .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED ,
524- .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED ,
524+ .pdev_bss_chan_info_request_cmdid =
525+ WMI_10_2_PDEV_BSS_CHAN_INFO_REQUEST_CMDID ,
525526};
526527
527528/* 10.4 WMI cmd track */
@@ -1633,6 +1634,7 @@ void ath10k_wmi_put_wmi_channel(struct wmi_channel *ch,
16331634 ch -> max_power = arg -> max_power ;
16341635 ch -> reg_power = arg -> max_reg_power ;
16351636 ch -> antenna_max = arg -> max_antenna_gain ;
1637+ ch -> max_tx_power = arg -> max_power ;
16361638
16371639 /* mode & flags share storage */
16381640 ch -> mode = arg -> mode ;
@@ -4792,6 +4794,58 @@ static int ath10k_wmi_event_temperature(struct ath10k *ar, struct sk_buff *skb)
47924794 return 0 ;
47934795}
47944796
4797+ static int ath10k_wmi_event_pdev_bss_chan_info (struct ath10k * ar ,
4798+ struct sk_buff * skb )
4799+ {
4800+ struct wmi_pdev_bss_chan_info_event * ev ;
4801+ struct survey_info * survey ;
4802+ u64 busy , total , tx , rx , rx_bss ;
4803+ u32 freq , noise_floor ;
4804+ u32 cc_freq_hz = ar -> hw_params .channel_counters_freq_hz ;
4805+ int idx ;
4806+
4807+ ev = (struct wmi_pdev_bss_chan_info_event * )skb -> data ;
4808+ if (WARN_ON (skb -> len < sizeof (* ev )))
4809+ return - EPROTO ;
4810+
4811+ freq = __le32_to_cpu (ev -> freq );
4812+ noise_floor = __le32_to_cpu (ev -> noise_floor );
4813+ busy = __le64_to_cpu (ev -> cycle_busy );
4814+ total = __le64_to_cpu (ev -> cycle_total );
4815+ tx = __le64_to_cpu (ev -> cycle_tx );
4816+ rx = __le64_to_cpu (ev -> cycle_rx );
4817+ rx_bss = __le64_to_cpu (ev -> cycle_rx_bss );
4818+
4819+ ath10k_dbg (ar , ATH10K_DBG_WMI ,
4820+ "wmi event pdev bss chan info:\n freq: %d noise: %d cycle: busy %llu total %llu tx %llu rx %llu rx_bss %llu\n" ,
4821+ freq , noise_floor , busy , total , tx , rx , rx_bss );
4822+
4823+ spin_lock_bh (& ar -> data_lock );
4824+ idx = freq_to_idx (ar , freq );
4825+ if (idx >= ARRAY_SIZE (ar -> survey )) {
4826+ ath10k_warn (ar , "bss chan info: invalid frequency %d (idx %d out of bounds)\n" ,
4827+ freq , idx );
4828+ goto exit ;
4829+ }
4830+
4831+ survey = & ar -> survey [idx ];
4832+
4833+ survey -> noise = noise_floor ;
4834+ survey -> time = div_u64 (total , cc_freq_hz );
4835+ survey -> time_busy = div_u64 (busy , cc_freq_hz );
4836+ survey -> time_rx = div_u64 (rx_bss , cc_freq_hz );
4837+ survey -> time_tx = div_u64 (tx , cc_freq_hz );
4838+ survey -> filled |= (SURVEY_INFO_NOISE_DBM |
4839+ SURVEY_INFO_TIME |
4840+ SURVEY_INFO_TIME_BUSY |
4841+ SURVEY_INFO_TIME_RX |
4842+ SURVEY_INFO_TIME_TX );
4843+ exit :
4844+ spin_unlock_bh (& ar -> data_lock );
4845+ complete (& ar -> bss_survey_done );
4846+ return 0 ;
4847+ }
4848+
47954849static void ath10k_wmi_op_rx (struct ath10k * ar , struct sk_buff * skb )
47964850{
47974851 struct wmi_cmd_hdr * cmd_hdr ;
@@ -5135,6 +5189,9 @@ static void ath10k_wmi_10_2_op_rx(struct ath10k *ar, struct sk_buff *skb)
51355189 case WMI_10_2_PDEV_TEMPERATURE_EVENTID :
51365190 ath10k_wmi_event_temperature (ar , skb );
51375191 break ;
5192+ case WMI_10_2_PDEV_BSS_CHAN_INFO_EVENTID :
5193+ ath10k_wmi_event_pdev_bss_chan_info (ar , skb );
5194+ break ;
51385195 case WMI_10_2_RTT_KEEPALIVE_EVENTID :
51395196 case WMI_10_2_GPIO_INPUT_EVENTID :
51405197 case WMI_10_2_PEER_RATECODE_LIST_EVENTID :
@@ -5212,6 +5269,7 @@ static void ath10k_wmi_10_4_op_rx(struct ath10k *ar, struct sk_buff *skb)
52125269 ath10k_wmi_event_vdev_stopped (ar , skb );
52135270 break ;
52145271 case WMI_10_4_WOW_WAKEUP_HOST_EVENTID :
5272+ case WMI_10_4_PEER_RATECODE_LIST_EVENTID :
52155273 ath10k_dbg (ar , ATH10K_DBG_WMI ,
52165274 "received event id %d not implemented\n" , id );
52175275 break ;
@@ -5221,6 +5279,9 @@ static void ath10k_wmi_10_4_op_rx(struct ath10k *ar, struct sk_buff *skb)
52215279 case WMI_10_4_PDEV_TEMPERATURE_EVENTID :
52225280 ath10k_wmi_event_temperature (ar , skb );
52235281 break ;
5282+ case WMI_10_4_PDEV_BSS_CHAN_INFO_EVENTID :
5283+ ath10k_wmi_event_pdev_bss_chan_info (ar , skb );
5284+ break ;
52245285 default :
52255286 ath10k_warn (ar , "Unknown eventid: %d\n" , id );
52265287 break ;
@@ -5606,6 +5667,9 @@ static struct sk_buff *ath10k_wmi_10_2_op_gen_init(struct ath10k *ar)
56065667 if (ath10k_peer_stats_enabled (ar ))
56075668 features |= WMI_10_2_PEER_STATS ;
56085669
5670+ if (test_bit (WMI_SERVICE_BSS_CHANNEL_INFO_64 , ar -> wmi .svc_map ))
5671+ features |= WMI_10_2_BSS_CHAN_INFO ;
5672+
56095673 cmd -> resource_config .feature_mask = __cpu_to_le32 (features );
56105674
56115675 memcpy (& cmd -> resource_config .common , & config , sizeof (config ));
@@ -6636,6 +6700,26 @@ ath10k_wmi_10_2_op_gen_pdev_get_temperature(struct ath10k *ar)
66366700 return skb ;
66376701}
66386702
6703+ static struct sk_buff *
6704+ ath10k_wmi_10_2_op_gen_pdev_bss_chan_info (struct ath10k * ar ,
6705+ enum wmi_bss_survey_req_type type )
6706+ {
6707+ struct wmi_pdev_chan_info_req_cmd * cmd ;
6708+ struct sk_buff * skb ;
6709+
6710+ skb = ath10k_wmi_alloc_skb (ar , sizeof (* cmd ));
6711+ if (!skb )
6712+ return ERR_PTR (- ENOMEM );
6713+
6714+ cmd = (struct wmi_pdev_chan_info_req_cmd * )skb -> data ;
6715+ cmd -> type = __cpu_to_le32 (type );
6716+
6717+ ath10k_dbg (ar , ATH10K_DBG_WMI ,
6718+ "wmi pdev bss info request type %d\n" , type );
6719+
6720+ return skb ;
6721+ }
6722+
66396723/* This function assumes the beacon is already DMA mapped */
66406724static struct sk_buff *
66416725ath10k_wmi_op_gen_beacon_dma (struct ath10k * ar , u32 vdev_id , const void * bcn ,
@@ -7735,6 +7819,7 @@ static const struct wmi_ops wmi_10_2_4_ops = {
77357819 .gen_init = ath10k_wmi_10_2_op_gen_init ,
77367820 .gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc ,
77377821 .gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature ,
7822+ .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info ,
77387823
77397824 /* shared with 10.1 */
77407825 .map_svc = wmi_10x_svc_map ,
@@ -7861,6 +7946,7 @@ static const struct wmi_ops wmi_10_4_ops = {
78617946 .gen_request_stats = ath10k_wmi_op_gen_request_stats ,
78627947 .gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature ,
78637948 .get_vdev_subtype = ath10k_wmi_10_4_op_get_vdev_subtype ,
7949+ .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info ,
78647950};
78657951
78667952int ath10k_wmi_attach (struct ath10k * ar )
0 commit comments