struct ieee80211_iface_combination *combinations;
        struct ieee80211_iface_limit *limits;
        int n_limits, max_interfaces;
-       bool ap, mesh;
+       bool ap, mesh, p2p;
 
        ap = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_AP);
+       p2p = ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_P2P_DEVICE);
 
        mesh = IS_ENABLED(CONFIG_MAC80211_MESH) &&
                ath12k_mac_is_iface_mode_enable(ah, NL80211_IFTYPE_MESH_POINT);
        if (!combinations)
                return -ENOMEM;
 
-       if (ap || mesh) {
+       if ((ap || mesh) && !p2p) {
                n_limits = 2;
                max_interfaces = 16;
+       } else if (p2p) {
+               n_limits = 3;
+               if (ap || mesh)
+                       max_interfaces = 16;
+               else
+                       max_interfaces = 3;
        } else {
                n_limits = 1;
                max_interfaces = 1;
        limits[0].max = 1;
        limits[0].types |= BIT(NL80211_IFTYPE_STATION);
 
-       if (ap) {
+       if (ap || mesh || p2p)
                limits[1].max = max_interfaces;
+
+       if (ap)
                limits[1].types |= BIT(NL80211_IFTYPE_AP);
-       }
 
        if (mesh)
                limits[1].types |= BIT(NL80211_IFTYPE_MESH_POINT);
 
+       if (p2p) {
+               limits[1].types |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
+                                  BIT(NL80211_IFTYPE_P2P_GO);
+               limits[2].max = 1;
+               limits[2].types |= BIT(NL80211_IFTYPE_P2P_DEVICE);
+       }
+
        combinations[0].limits = limits;
        combinations[0].n_limits = n_limits;
        combinations[0].max_interfaces = max_interfaces;