|
@@ -3256,6 +3256,50 @@ static int ath10k_wmi_op_pull_swba_ev(struct ath10k *ar, struct sk_buff *skb,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int ath10k_wmi_10_2_4_op_pull_swba_ev(struct ath10k *ar,
|
|
|
|
+ struct sk_buff *skb,
|
|
|
|
+ struct wmi_swba_ev_arg *arg)
|
|
|
|
+{
|
|
|
|
+ struct wmi_10_2_4_host_swba_event *ev = (void *)skb->data;
|
|
|
|
+ u32 map;
|
|
|
|
+ size_t i;
|
|
|
|
+
|
|
|
|
+ if (skb->len < sizeof(*ev))
|
|
|
|
+ return -EPROTO;
|
|
|
|
+
|
|
|
|
+ skb_pull(skb, sizeof(*ev));
|
|
|
|
+ arg->vdev_map = ev->vdev_map;
|
|
|
|
+
|
|
|
|
+ for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) {
|
|
|
|
+ if (!(map & BIT(0)))
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ /* If this happens there were some changes in firmware and
|
|
|
|
+ * ath10k should update the max size of tim_info array.
|
|
|
|
+ */
|
|
|
|
+ if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info)))
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) >
|
|
|
|
+ sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) {
|
|
|
|
+ ath10k_warn(ar, "refusing to parse invalid swba structure\n");
|
|
|
|
+ return -EPROTO;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len;
|
|
|
|
+ arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast;
|
|
|
|
+ arg->tim_info[i].tim_bitmap =
|
|
|
|
+ ev->bcn_info[i].tim_info.tim_bitmap;
|
|
|
|
+ arg->tim_info[i].tim_changed =
|
|
|
|
+ ev->bcn_info[i].tim_info.tim_changed;
|
|
|
|
+ arg->tim_info[i].tim_num_ps_pending =
|
|
|
|
+ ev->bcn_info[i].tim_info.tim_num_ps_pending;
|
|
|
|
+ i++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static int ath10k_wmi_10_4_op_pull_swba_ev(struct ath10k *ar,
|
|
static int ath10k_wmi_10_4_op_pull_swba_ev(struct ath10k *ar,
|
|
struct sk_buff *skb,
|
|
struct sk_buff *skb,
|
|
struct wmi_swba_ev_arg *arg)
|
|
struct wmi_swba_ev_arg *arg)
|
|
@@ -7584,7 +7628,7 @@ static const struct wmi_ops wmi_10_2_4_ops = {
|
|
.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
|
|
.pull_ch_info = ath10k_wmi_op_pull_ch_info_ev,
|
|
.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
|
|
.pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev,
|
|
.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
|
|
.pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev,
|
|
- .pull_swba = ath10k_wmi_op_pull_swba_ev,
|
|
|
|
|
|
+ .pull_swba = ath10k_wmi_10_2_4_op_pull_swba_ev,
|
|
.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
|
|
.pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr,
|
|
.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
|
|
.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
|
|
.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
|
|
.pull_rdy = ath10k_wmi_op_pull_rdy_ev,
|