aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath10k/wmi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath/ath10k/wmi.c')
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.c67
1 files changed, 50 insertions, 17 deletions
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index 6279ab4a760e..169cd2e783eb 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -1826,7 +1826,7 @@ static struct sk_buff *
1826ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu) 1826ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
1827{ 1827{
1828 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(msdu); 1828 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(msdu);
1829 struct ath10k_vif *arvif = (void *)cb->vif->drv_priv; 1829 struct ath10k_vif *arvif;
1830 struct wmi_mgmt_tx_cmd *cmd; 1830 struct wmi_mgmt_tx_cmd *cmd;
1831 struct ieee80211_hdr *hdr; 1831 struct ieee80211_hdr *hdr;
1832 struct sk_buff *skb; 1832 struct sk_buff *skb;
@@ -1838,10 +1838,12 @@ ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
1838 hdr = (struct ieee80211_hdr *)msdu->data; 1838 hdr = (struct ieee80211_hdr *)msdu->data;
1839 fc = le16_to_cpu(hdr->frame_control); 1839 fc = le16_to_cpu(hdr->frame_control);
1840 1840
1841 if (cb->vif) 1841 if (cb->vif) {
1842 arvif = (void *)cb->vif->drv_priv;
1842 vdev_id = arvif->vdev_id; 1843 vdev_id = arvif->vdev_id;
1843 else 1844 } else {
1844 vdev_id = 0; 1845 vdev_id = 0;
1846 }
1845 1847
1846 if (WARN_ON_ONCE(!ieee80211_is_mgmt(hdr->frame_control))) 1848 if (WARN_ON_ONCE(!ieee80211_is_mgmt(hdr->frame_control)))
1847 return ERR_PTR(-EINVAL); 1849 return ERR_PTR(-EINVAL);
@@ -2924,6 +2926,7 @@ static int ath10k_wmi_10_4_op_pull_fw_stats(struct ath10k *ar,
2924 u32 num_pdev_ext_stats; 2926 u32 num_pdev_ext_stats;
2925 u32 num_vdev_stats; 2927 u32 num_vdev_stats;
2926 u32 num_peer_stats; 2928 u32 num_peer_stats;
2929 u32 num_bcnflt_stats;
2927 u32 stats_id; 2930 u32 stats_id;
2928 int i; 2931 int i;
2929 2932
@@ -2934,6 +2937,7 @@ static int ath10k_wmi_10_4_op_pull_fw_stats(struct ath10k *ar,
2934 num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats); 2937 num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats);
2935 num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats); 2938 num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
2936 num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 2939 num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
2940 num_bcnflt_stats = __le32_to_cpu(ev->num_bcnflt_stats);
2937 stats_id = __le32_to_cpu(ev->stats_id); 2941 stats_id = __le32_to_cpu(ev->stats_id);
2938 2942
2939 for (i = 0; i < num_pdev_stats; i++) { 2943 for (i = 0; i < num_pdev_stats; i++) {
@@ -2974,32 +2978,57 @@ static int ath10k_wmi_10_4_op_pull_fw_stats(struct ath10k *ar,
2974 /* fw doesn't implement vdev stats */ 2978 /* fw doesn't implement vdev stats */
2975 2979
2976 for (i = 0; i < num_peer_stats; i++) { 2980 for (i = 0; i < num_peer_stats; i++) {
2977 const struct wmi_10_4_peer_extd_stats *src; 2981 const struct wmi_10_4_peer_stats *src;
2978 struct ath10k_fw_stats_peer *dst; 2982 struct ath10k_fw_stats_peer *dst;
2979 int stats_len;
2980 bool extd_peer_stats = !!(stats_id & WMI_10_4_STAT_PEER_EXTD);
2981
2982 if (extd_peer_stats)
2983 stats_len = sizeof(struct wmi_10_4_peer_extd_stats);
2984 else
2985 stats_len = sizeof(struct wmi_10_4_peer_stats);
2986 2983
2987 src = (void *)skb->data; 2984 src = (void *)skb->data;
2988 if (!skb_pull(skb, stats_len)) 2985 if (!skb_pull(skb, sizeof(*src)))
2989 return -EPROTO; 2986 return -EPROTO;
2990 2987
2991 dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 2988 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
2992 if (!dst) 2989 if (!dst)
2993 continue; 2990 continue;
2994 2991
2995 ath10k_wmi_10_4_pull_peer_stats(&src->common, dst); 2992 ath10k_wmi_10_4_pull_peer_stats(src, dst);
2996 /* FIXME: expose 10.4 specific values */
2997 if (extd_peer_stats)
2998 dst->rx_duration = __le32_to_cpu(src->rx_duration);
2999
3000 list_add_tail(&dst->list, &stats->peers); 2993 list_add_tail(&dst->list, &stats->peers);
3001 } 2994 }
3002 2995
2996 for (i = 0; i < num_bcnflt_stats; i++) {
2997 const struct wmi_10_4_bss_bcn_filter_stats *src;
2998
2999 src = (void *)skb->data;
3000 if (!skb_pull(skb, sizeof(*src)))
3001 return -EPROTO;
3002
3003 /* FIXME: expose values to userspace
3004 *
3005 * Note: Even though this loop seems to do nothing it is
3006 * required to parse following sub-structures properly.
3007 */
3008 }
3009
3010 if ((stats_id & WMI_10_4_STAT_PEER_EXTD) == 0)
3011 return 0;
3012
3013 stats->extended = true;
3014
3015 for (i = 0; i < num_peer_stats; i++) {
3016 const struct wmi_10_4_peer_extd_stats *src;
3017 struct ath10k_fw_extd_stats_peer *dst;
3018
3019 src = (void *)skb->data;
3020 if (!skb_pull(skb, sizeof(*src)))
3021 return -EPROTO;
3022
3023 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
3024 if (!dst)
3025 continue;
3026
3027 ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr);
3028 dst->rx_duration = __le32_to_cpu(src->rx_duration);
3029 list_add_tail(&dst->list, &stats->peers_extd);
3030 }
3031
3003 return 0; 3032 return 0;
3004} 3033}
3005 3034
@@ -5257,6 +5286,9 @@ static void ath10k_wmi_10_4_op_rx(struct ath10k *ar, struct sk_buff *skb)
5257 case WMI_10_4_PEER_STA_KICKOUT_EVENTID: 5286 case WMI_10_4_PEER_STA_KICKOUT_EVENTID:
5258 ath10k_wmi_event_peer_sta_kickout(ar, skb); 5287 ath10k_wmi_event_peer_sta_kickout(ar, skb);
5259 break; 5288 break;
5289 case WMI_10_4_ROAM_EVENTID:
5290 ath10k_wmi_event_roam(ar, skb);
5291 break;
5260 case WMI_10_4_HOST_SWBA_EVENTID: 5292 case WMI_10_4_HOST_SWBA_EVENTID:
5261 ath10k_wmi_event_host_swba(ar, skb); 5293 ath10k_wmi_event_host_swba(ar, skb);
5262 break; 5294 break;
@@ -7903,6 +7935,7 @@ static const struct wmi_ops wmi_10_4_ops = {
7903 .pull_phyerr = ath10k_wmi_10_4_op_pull_phyerr_ev, 7935 .pull_phyerr = ath10k_wmi_10_4_op_pull_phyerr_ev,
7904 .pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev, 7936 .pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev,
7905 .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 7937 .pull_rdy = ath10k_wmi_op_pull_rdy_ev,
7938 .pull_roam_ev = ath10k_wmi_op_pull_roam_ev,
7906 .get_txbf_conf_scheme = ath10k_wmi_10_4_txbf_conf_scheme, 7939 .get_txbf_conf_scheme = ath10k_wmi_10_4_txbf_conf_scheme,
7907 7940
7908 .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 7941 .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,