diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath10k/wmi.c')
-rw-r--r-- | drivers/net/wireless/ath/ath10k/wmi.c | 67 |
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 * | |||
1826 | ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu) | 1826 | ath10k_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, |