OSDN Git Service

wifi: iwlwifi: mvm: allow number of beacons from FW
authorJohannes Berg <johannes.berg@intel.com>
Sun, 16 Apr 2023 12:47:37 +0000 (15:47 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 17 Apr 2023 07:53:25 +0000 (09:53 +0200)
Newer firmware images have a TLV advertising how many
beacons they support, use that to permit adding more
links in AP mode (FW needs to support at least as many
links as beacons).

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230416154301.0d7522533557.Ic6b5992e94446c35cb0f3add019defa6e7aded2a@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/file.h
drivers/net/wireless/intel/iwlwifi/fw/img.h
drivers/net/wireless/intel/iwlwifi/iwl-drv.c
drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c

index b00174c..cddf09d 100644 (file)
@@ -104,6 +104,7 @@ enum iwl_ucode_tlv_type {
        IWL_UCODE_TLV_CURRENT_PC                = 68,
 
        IWL_UCODE_TLV_FW_NUM_STATIONS           = IWL_UCODE_TLV_CONST_BASE + 0,
+       IWL_UCODE_TLV_FW_NUM_BEACONS            = IWL_UCODE_TLV_CONST_BASE + 2,
 
        IWL_UCODE_TLV_TYPE_DEBUG_INFO           = IWL_UCODE_TLV_DEBUG_BASE + 0,
        IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION    = IWL_UCODE_TLV_DEBUG_BASE + 1,
index f5c4d93..8d0d58d 100644 (file)
@@ -51,6 +51,7 @@ struct iwl_ucode_capabilities {
        u32 error_log_addr;
        u32 error_log_size;
        u32 num_stations;
+       u32 num_beacons;
        unsigned long _api[BITS_TO_LONGS(NUM_IWL_UCODE_TLV_API)];
        unsigned long _capa[BITS_TO_LONGS(NUM_IWL_UCODE_TLV_CAPA)];
 
index 042c06a..34feb4d 100644 (file)
@@ -1155,6 +1155,12 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
                        capa->num_stations =
                                le32_to_cpup((const __le32 *)tlv_data);
                        break;
+               case IWL_UCODE_TLV_FW_NUM_BEACONS:
+                       if (tlv_len != sizeof(u32))
+                               goto invalid_tlv_len;
+                       capa->num_beacons =
+                               le32_to_cpup((const __le32 *)tlv_data);
+                       break;
                case IWL_UCODE_TLV_UMAC_DEBUG_ADDRS: {
                        const struct iwl_umac_debug_addrs *dbg_ptrs =
                                (const void *)tlv_data;
@@ -1415,6 +1421,7 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
                        IWL_DEFAULT_STANDARD_PHY_CALIBRATE_TBL_SIZE;
        fw->ucode_capa.n_scan_channels = IWL_DEFAULT_SCAN_CHANNELS;
        fw->ucode_capa.num_stations = IWL_MVM_STATION_COUNT_MAX;
+       fw->ucode_capa.num_beacons = 1;
        /* dump all fw memory areas by default */
        fw->dbg.dump_mask = 0xffffffff;
 
index 203f251..99ef12c 100644 (file)
@@ -882,7 +882,10 @@ iwl_mvm_mld_change_vif_links(struct ieee80211_hw *hw,
                                n_active++;
                }
 
-               if (n_active > 1)
+               if (vif->type == NL80211_IFTYPE_AP &&
+                   n_active > mvm->fw->ucode_capa.num_beacons)
+                       return -EOPNOTSUPP;
+               else if (n_active > 1)
                        return -EOPNOTSUPP;
        }