(void *)tb);
 }
 
-const void **ath11k_wmi_tlv_parse_alloc(struct ath11k_base *ab, const void *ptr,
-                                       size_t len, gfp_t gfp)
+const void **ath11k_wmi_tlv_parse_alloc(struct ath11k_base *ab,
+                                       struct sk_buff *skb, gfp_t gfp)
 {
        const void **tb;
        int ret;
        if (!tb)
                return ERR_PTR(-ENOMEM);
 
-       ret = ath11k_wmi_tlv_parse(ab, tb, ptr, len);
+       ret = ath11k_wmi_tlv_parse(ab, tb, skb->data, skb->len);
        if (ret) {
                kfree(tb);
                return ERR_PTR(ret);
        struct ath11k_vif *arvif;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const struct wmi_vdev_start_resp_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
 
        ath11k_dbg(ab, ATH11K_DBG_WMI, "processing regulatory channel list\n");
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
 
        ath11k_dbg(ab, ATH11K_DBG_WMI, "processing regulatory ext channel list\n");
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const struct wmi_peer_delete_resp_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const struct wmi_vdev_delete_resp_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        return 0;
 }
 
-static int ath11k_pull_bcn_tx_status_ev(struct ath11k_base *ab, void *evt_buf,
-                                       u32 len, u32 *vdev_id,
-                                       u32 *tx_status)
+static int ath11k_pull_bcn_tx_status_ev(struct ath11k_base *ab,
+                                       struct sk_buff *skb,
+                                       u32 *vdev_id, u32 *tx_status)
 {
        const void **tb;
        const struct wmi_bcn_tx_status_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, evt_buf, len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const struct wmi_vdev_stopped_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const struct wmi_mgmt_tx_compl_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const struct wmi_scan_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const struct wmi_peer_sta_kickout_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const struct wmi_roam_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        return idx;
 }
 
-static int ath11k_pull_chan_info_ev(struct ath11k_base *ab, u8 *evt_buf,
-                                   u32 len, struct wmi_chan_info_event *ch_info_ev)
+static int ath11k_pull_chan_info_ev(struct ath11k_base *ab, struct sk_buff *skb,
+                                   struct wmi_chan_info_event *ch_info_ev)
 {
        const void **tb;
        const struct wmi_chan_info_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, evt_buf, len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const struct wmi_pdev_bss_chan_info_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const struct wmi_vdev_install_key_compl_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const struct wmi_peer_assoc_conf_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const void **tb;
        int ret, i;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        struct ath11k_vif *arvif;
        u32 vdev_id, tx_status;
 
-       if (ath11k_pull_bcn_tx_status_ev(ab, skb->data, skb->len,
-                                        &vdev_id, &tx_status) != 0) {
+       if (ath11k_pull_bcn_tx_status_ev(ab, skb, &vdev_id, &tx_status) != 0) {
                ath11k_warn(ab, "failed to extract bcn tx status");
                return;
        }
        enum ath11k_wmi_peer_ps_state peer_previous_ps_state;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        /* HW channel counters frequency value in hertz */
        u32 cc_freq_hz = ab->cc_freq_hz;
 
-       if (ath11k_pull_chan_info_ev(ab, skb->data, skb->len, &ch_info_ev) != 0) {
+       if (ath11k_pull_chan_info_ev(ab, skb, &ch_info_ev) != 0) {
                ath11k_warn(ab, "failed to extract chan info event");
                return;
        }
        const struct wmi_pdev_ctl_failsafe_chk_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const u32 *vdev_ids;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        struct ath11k *ar;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const struct wmi_pdev_temperature_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);
        const struct wmi_fils_discovery_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab,
        const struct wmi_probe_resp_tx_status_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab,
        const struct wmi_twt_add_dialog_event *ev;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab,
        u64    replay_ctr;
        int ret;
 
-       tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC);
+       tb = ath11k_wmi_tlv_parse_alloc(ab, skb, GFP_ATOMIC);
        if (IS_ERR(tb)) {
                ret = PTR_ERR(tb);
                ath11k_warn(ab, "failed to parse tlv: %d\n", ret);