qcacmn: Pass hopping radar test when DFS puncture enabled

Hopping radar happens on whole band, hope all DFS sub channels are put to
NOL, but F/W only reports single radar event on special freq to host.
When DFS puncture enabled, sub channel marking is enabled, host only put
single affected 20M sub channel to NOL instead of all current bonded sub
channel, AP still stays on current freq for valid puncture bitmap
instead of leave DFS freq.

If the radar is a frequency hopping radar that truly hops over entire DFS
band, then the AP and clients are best served by moving out of the DFS
band. But it could well be that only part of the band is used. It is
difficult to find product specifications with info on the total bandwidth.
Mostly military systems use frequency hopping to avoid jamming. So a middle
ground would be to put full bandwidth of current AP to NOL for FCC type 6
frequency hopping radar.

When frequency hopping radar happens, F/W set flag that full bandwidth need
put to NOL in new added tlv radar_flags of event
WMI_PDEV_DFS_RADAR_DETECTION_EVENT, When find the flag is set, host will
put full bandwidth of current AP to NOL even sub channel marking is
enabled.

To avoid compatibility issue between old/new F/W and new/old host, add a
F/W service bit wmi_service_radar_flags_support and host service flag
is_full_bw_nol_supported.
If the wmi_service WMI_SERVICE_RADAR_FLAGS_SUPPORT is enabled by FW, host
shall set/unset a bit in the host service flag is_full_bw_nol_supported
based on host capabilities. This host service flag is then sent to FW via
WMI_INIT_CMDID.

Change-Id: I6e280ca4ab00dce97c5aec90c7a4b4fc7c4a440a
CRs-Fixed: 3595476
This commit is contained in:
Jianmin Zhu
2023-08-14 11:08:50 +08:00
committed by Rahul Choudhary
parent 9bfc041802
commit f6fa6b6729
5 changed files with 75 additions and 0 deletions

View File

@@ -9401,6 +9401,22 @@ void wmi_copy_latency_flowq_support(wmi_resource_config *resource_cfg,
}
#endif
#ifdef MOBILE_DFS_SUPPORT
static inline
void wmi_copy_full_bw_nol_cfg(wmi_resource_config *resource_cfg,
target_resource_config *tgt_res_cfg)
{
WMI_RSRC_CFG_HOST_SERVICE_FLAG_RADAR_FLAGS_FULL_BW_NOL_SET(resource_cfg->host_service_flags,
tgt_res_cfg->is_full_bw_nol_supported);
}
#else
static inline
void wmi_copy_full_bw_nol_cfg(wmi_resource_config *resource_cfg,
target_resource_config *tgt_res_cfg)
{
}
#endif
static
void wmi_copy_resource_config(wmi_resource_config *resource_cfg,
target_resource_config *tgt_res_cfg)
@@ -9700,6 +9716,8 @@ void wmi_copy_resource_config(wmi_resource_config *resource_cfg,
}
wmi_copy_latency_flowq_support(resource_cfg, tgt_res_cfg);
wmi_copy_full_bw_nol_cfg(resource_cfg, tgt_res_cfg);
}
#ifdef FEATURE_SET
@@ -17279,6 +17297,7 @@ static QDF_STATUS extract_dfs_radar_detection_event_tlv(
if (radar_found->pdev_id == WMI_HOST_PDEV_ID_INVALID)
return QDF_STATUS_E_FAILURE;
qdf_mem_zero(radar_found, sizeof(struct radar_found_info));
radar_found->detection_mode = radar_event->detection_mode;
radar_found->chan_freq = radar_event->chan_freq;
radar_found->chan_width = radar_event->chan_width;
@@ -17289,6 +17308,19 @@ static QDF_STATUS extract_dfs_radar_detection_event_tlv(
radar_found->freq_offset = radar_event->freq_offset;
radar_found->sidx = radar_event->sidx;
if (is_service_enabled_tlv(wmi_handle,
WMI_SERVICE_RADAR_FLAGS_SUPPORT)) {
WMI_RADAR_FLAGS *radar_flags;
radar_flags = param_tlv->radar_flags;
if (radar_flags) {
radar_found->is_full_bw_nol =
WMI_RADAR_FLAGS_FULL_BW_NOL_GET(radar_flags->flags);
wmi_debug("Is full bw nol %d",
radar_found->is_full_bw_nol);
}
}
wmi_debug("processed radar found event pdev %d,"
"Radar Event Info:pdev_id %d,timestamp %d,chan_freq (dur) %d,"
"chan_width (RSSI) %d,detector_id (false_radar) %d,"
@@ -22765,6 +22797,8 @@ static void populate_tlv_service(uint32_t *wmi_service)
#endif
wmi_service[wmi_service_fisa_dynamic_msdu_aggr_size_support] =
WMI_SERVICE_FISA_DYNAMIC_MSDU_AGGR_SIZE_SUPPORT;
wmi_service[wmi_service_radar_flags_support] =
WMI_SERVICE_RADAR_FLAGS_SUPPORT;
}
/**