static const struct ieee80211_iface_limit iwl_mld_limits_nan[] = {
{
- .max = 2,
+ .max = 1,
.types = BIT(NL80211_IFTYPE_STATION),
},
{
.max = 1,
.types = BIT(NL80211_IFTYPE_NAN),
},
+ {
+ .max = 2,
+ .types = BIT(NL80211_IFTYPE_NAN_DATA),
+ },
};
static const struct ieee80211_iface_combination
},
/* NAN combination follow, this excludes P2P and AP */
{
- .num_different_channels = 2,
- .max_interfaces = 3,
+ .num_different_channels = 3,
+ .max_interfaces = 4,
.limits = iwl_mld_limits_nan,
.n_limits = ARRAY_SIZE(iwl_mld_limits_nan),
},
struct ieee80211_hw *hw = mld->hw;
hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_NAN);
+ hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_NAN_DATA);
hw->wiphy->nan_supported_bands = BIT(NL80211_BAND_2GHZ);
if (mld->nvm_data->bands[NL80211_BAND_5GHZ].n_channels)
ARRAY_SIZE(iwl_mld_iface_combinations);
iwl_mld_hw_set_nan(mld);
} else {
- /* Do not include NAN combinations */
+ /* Do not include NAN combination */
wiphy->n_iface_combinations =
ARRAY_SIZE(iwl_mld_iface_combinations) - 1;
}
bool iwl_mld_nan_supported(struct iwl_mld *mld)
{
- return fw_has_capa(&mld->fw->ucode_capa,
- IWL_UCODE_TLV_CAPA_NAN_SYNC_SUPPORT);
+ const struct iwl_fw *fw = mld->fw;
+
+ if (fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_NAN_SYNC_SUPPORT) &&
+ iwl_fw_lookup_cmd_ver(fw, WIDE_ID(MAC_CONF_GROUP, NAN_SCHEDULE_CMD), 0) >= 1 &&
+ iwl_fw_lookup_cmd_ver(fw, WIDE_ID(MAC_CONF_GROUP, NAN_PEER_CMD), 0) >= 1 &&
+ iwl_fw_lookup_cmd_ver(fw, WIDE_ID(MAC_CONF_GROUP, STA_CONFIG_CMD), 0) >= 3 &&
+ iwl_fw_lookup_cmd_ver(fw, WIDE_ID(MAC_CONF_GROUP, MAC_CONFIG_CMD), 0) >= 4 &&
+ iwl_fw_lookup_cmd_ver(fw, WIDE_ID(DATA_PATH_GROUP, TLC_MNG_CONFIG_CMD), 0) >= 6)
+ return true;
+ return false;
}
static int iwl_mld_nan_send_config_cmd(struct iwl_mld *mld,