if (phy_id >= hal_reg_caps->num_phy)
                return -EINVAL;
 
-       mac_phy_caps = &wmi_mac_phy_caps[phy_idx];
+       mac_phy_caps = wmi_mac_phy_caps + phy_idx;
 
        pdev->pdev_id = mac_phy_caps->pdev_id;
        pdev_cap->supported_bands = mac_phy_caps->supported_bands;
        if (svc_rdy_ext->n_mac_phy_caps >= svc_rdy_ext->tot_phy_id)
                return -ENOBUFS;
 
+       len = min_t(u16, len, sizeof(struct wmi_mac_phy_capabilities));
+       if (!svc_rdy_ext->n_mac_phy_caps) {
+               svc_rdy_ext->mac_phy_caps = kzalloc((svc_rdy_ext->tot_phy_id) * len,
+                                                   GFP_ATOMIC);
+               if (!svc_rdy_ext->mac_phy_caps)
+                       return -ENOMEM;
+       }
+
+       memcpy(svc_rdy_ext->mac_phy_caps + svc_rdy_ext->n_mac_phy_caps, ptr, len);
        svc_rdy_ext->n_mac_phy_caps++;
        return 0;
 }
                        svc_rdy_ext->hw_mode_done = true;
                } else if (!svc_rdy_ext->mac_phy_done) {
                        svc_rdy_ext->n_mac_phy_caps = 0;
-                       svc_rdy_ext->mac_phy_caps =
-                                       (struct wmi_mac_phy_capabilities *)ptr;
                        ret = ath11k_wmi_tlv_iter(ab, ptr, len,
                                                  ath11k_wmi_tlv_mac_phy_caps_parse,
                                                  svc_rdy_ext);
                return ret;
        }
 
+       kfree(svc_rdy_ext.mac_phy_caps);
        return 0;
 }