|
@@ -151,6 +151,7 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len)
|
|
|
const struct carl9170fw_chk_desc *chk_desc;
|
|
|
const struct carl9170fw_last_desc *last_desc;
|
|
|
const struct carl9170fw_txsq_desc *txsq_desc;
|
|
|
+ u16 if_comb_types;
|
|
|
|
|
|
last_desc = carl9170_fw_find_desc(ar, LAST_MAGIC,
|
|
|
sizeof(*last_desc), CARL9170FW_LAST_DESC_CUR_VER);
|
|
@@ -268,6 +269,9 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len)
|
|
|
if (SUPP(CARL9170FW_WOL))
|
|
|
device_set_wakeup_enable(&ar->udev->dev, true);
|
|
|
|
|
|
+ if_comb_types = BIT(NL80211_IFTYPE_STATION) |
|
|
|
+ BIT(NL80211_IFTYPE_P2P_CLIENT);
|
|
|
+
|
|
|
ar->fw.vif_num = otus_desc->vif_num;
|
|
|
ar->fw.cmd_bufs = otus_desc->cmd_bufs;
|
|
|
ar->fw.address = le32_to_cpu(otus_desc->fw_address);
|
|
@@ -294,12 +298,25 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len)
|
|
|
ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
|
|
|
|
|
|
if (SUPP(CARL9170FW_WLANTX_CAB)) {
|
|
|
- ar->hw->wiphy->interface_modes |=
|
|
|
+ if_comb_types |=
|
|
|
BIT(NL80211_IFTYPE_AP) |
|
|
|
BIT(NL80211_IFTYPE_P2P_GO);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ ar->if_comb_limits[0].max = ar->fw.vif_num;
|
|
|
+ ar->if_comb_limits[0].types = if_comb_types;
|
|
|
+
|
|
|
+ ar->if_combs[0].num_different_channels = 1;
|
|
|
+ ar->if_combs[0].max_interfaces = ar->fw.vif_num;
|
|
|
+ ar->if_combs[0].limits = ar->if_comb_limits;
|
|
|
+ ar->if_combs[0].n_limits = ARRAY_SIZE(ar->if_comb_limits);
|
|
|
+
|
|
|
+ ar->hw->wiphy->iface_combinations = ar->if_combs;
|
|
|
+ ar->hw->wiphy->n_iface_combinations = ARRAY_SIZE(ar->if_combs);
|
|
|
+
|
|
|
+ ar->hw->wiphy->interface_modes |= if_comb_types;
|
|
|
+
|
|
|
txsq_desc = carl9170_fw_find_desc(ar, TXSQ_MAGIC,
|
|
|
sizeof(*txsq_desc), CARL9170FW_TXSQ_DESC_CUR_VER);
|
|
|
|