Merge "qca-wifi: Extract Peer Ratecode list event data"
diff --git a/dp/inc/cdp_txrx_extd_struct.h b/dp/inc/cdp_txrx_extd_struct.h
index b1342fa..0746e27 100644
--- a/dp/inc/cdp_txrx_extd_struct.h
+++ b/dp/inc/cdp_txrx_extd_struct.h
@@ -40,6 +40,9 @@
* <enum 1 bw_40_MHz>
* <enum 2 bw_80_MHz>
* <enum 3 bw_160_MHz>
+ * @ofdma_info_valid: RU info valid
+ * @ofdma_ru_start_index: RU index number(0-73)
+ * @ofdma_ru_width: size of RU in units of 1(26tone)RU
* @nss: NSS 1,2, ...8
* @mcs: MCS index
* @preamble: preamble
diff --git a/dp/wifi3.0/dp_rx_mon_feature.c b/dp/wifi3.0/dp_rx_mon_feature.c
index 657b05e..c8b4704 100644
--- a/dp/wifi3.0/dp_rx_mon_feature.c
+++ b/dp/wifi3.0/dp_rx_mon_feature.c
@@ -74,6 +74,7 @@
uint32_t user)
{
int i;
+ struct mon_rx_user_status *rx_user_status;
cdp_mpdu_info->ppdu_id = ppdu_info->com_info.ppdu_id;
cdp_mpdu_info->channel = ppdu_info->rx_status.chan_num;
@@ -92,8 +93,16 @@
cdp_mpdu_info->nf = ppdu_info->rx_status.chan_noise_floor;
if (ppdu_info->rx_status.reception_type == HAL_RX_TYPE_MU_OFDMA) {
- cdp_mpdu_info->nss = ppdu_info->rx_user_status[user].nss;
- cdp_mpdu_info->mcs = ppdu_info->rx_user_status[user].mcs;
+ rx_user_status = &ppdu_info->rx_user_status[user];
+ cdp_mpdu_info->nss = rx_user_status->nss;
+ cdp_mpdu_info->mcs = rx_user_status->mcs;
+ cdp_mpdu_info->ofdma_info_valid =
+ rx_user_status->ofdma_info_valid;
+ cdp_mpdu_info->ofdma_ru_start_index =
+ rx_user_status->dl_ofdma_ru_start_index;
+ cdp_mpdu_info->ofdma_ru_width =
+ rx_user_status->dl_ofdma_ru_width;
+
} else {
cdp_mpdu_info->nss = ppdu_info->rx_status.nss;
cdp_mpdu_info->mcs = ppdu_info->rx_status.mcs;
diff --git a/target_if/cfr/src/target_if_cfr_wifi2_0.c b/target_if/cfr/src/target_if_cfr_wifi2_0.c
index 88e3a8a..8d3b5a8 100644
--- a/target_if/cfr/src/target_if_cfr_wifi2_0.c
+++ b/target_if/cfr/src/target_if_cfr_wifi2_0.c
@@ -239,7 +239,7 @@
return QDF_STATUS_E_FAILURE;
target_type = target_if_cfr_get_target_type(psoc);
- tgt_hdl = (struct target_psoc_info *)wlan_psoc_get_tgt_if_handle(psoc);
+ tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
if (tgt_hdl)
info = (&(tgt_hdl->info));
diff --git a/umac/dfs/core/src/misc/dfs_zero_cac.c b/umac/dfs/core/src/misc/dfs_zero_cac.c
index 6318741..f9cf7ef 100644
--- a/umac/dfs/core/src/misc/dfs_zero_cac.c
+++ b/umac/dfs/core/src/misc/dfs_zero_cac.c
@@ -508,6 +508,7 @@
uint8_t cur_dfs_idx = 0;
uint8_t vhtop_ch_freq_seg1, vhtop_ch_freq_seg2;
int i;
+ struct dfs_agile_cac_params adfs_param;
psoc = wlan_pdev_get_psoc(dfs->dfs_pdev_obj);
dfs_soc_obj = dfs->dfs_soc_obj;
@@ -551,10 +552,15 @@
}
if (ch_freq) {
+ adfs_param.precac_chan = ch_freq;
+ adfs_param.precac_chwidth = dfs->dfs_precac_chwidth;
+ dfs_start_agile_precac_timer(temp_dfs,
+ dfs->dfs_soc_obj->ocac_status,
+ &adfs_param);
qdf_info("%s : %d ADFS channel set request sent for pdev: %pK ch_freq: %d",
__func__, __LINE__, pdev, ch_freq);
if (dfs_tx_ops && dfs_tx_ops->dfs_agile_ch_cfg_cmd)
- dfs_tx_ops->dfs_agile_ch_cfg_cmd(pdev, &ch_freq);
+ dfs_tx_ops->dfs_agile_ch_cfg_cmd(pdev, &adfs_param);
else
dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
"dfs_tx_ops=%pK", dfs_tx_ops);
@@ -930,6 +936,7 @@
uint32_t center_freq)
{
struct wlan_dfs *dfs = NULL;
+ struct dfs_agile_cac_params adfs_param;
dfs = wlan_pdev_get_dfs_obj(pdev);
@@ -950,7 +957,11 @@
* TRIGGER agile precac timer with 0sec timeout
* with ocac_status 0 for old pdev
*/
- dfs_start_agile_precac_timer(dfs, center_freq, ocac_status);
+ adfs_param.precac_chan = center_freq;
+ adfs_param.precac_chwidth = dfs->dfs_precac_chwidth;
+ dfs_start_agile_precac_timer(dfs,
+ ocac_status,
+ &adfs_param);
} else {
dfs_debug(NULL, WLAN_DEBUG_DFS_ALWAYS, "Error Unknown");
}
@@ -1627,28 +1638,94 @@
}
#ifdef QCA_SUPPORT_AGILE_DFS
-#define DEFAULT_CAC_DURATION 62
-void dfs_start_agile_precac_timer(struct wlan_dfs *dfs, uint8_t precac_chan,
- uint8_t ocac_status)
+/* FIND_IF_OVERLAP_WITH_WEATHER_RANGE() - Find if the given channel range
+ * overlaps with the weather channel range.
+ * @first_ch: First subchannel of the channel range.
+ * @last_ch: Last subchannel of the channel range.
+ *
+ * Algorithm:
+ * If the first channel of given range is left of last weather channel
+ * and if the last channel of given range is right of the first weather channel,
+ * return true, else false.
+ */
+#define FIND_IF_OVERLAP_WITH_WEATHER_RANGE(first_ch, last_ch) \
+((first_ch <= WEATHER_CHAN_START) && (WEATHER_CHAN_END <= last_ch))
+
+/* dfs_is_precac_on_weather_channel() - Given a channel number, find if
+ * it's a weather radar channel.
+ * @dfs: Pointer to WLAN_DFS structure.
+ * @chwidth: PreCAC channel width enum.
+ * @precac_chan: Channel for preCAC.
+ *
+ * Based on the precac_width, find the first and last subchannels of the given
+ * preCAC channel and check if this range overlaps with weather channel range.
+ *
+ * Return: True if weather channel, else false.
+ */
+static bool dfs_is_precac_on_weather_channel(struct wlan_dfs *dfs,
+ enum phy_ch_width chwidth,
+ uint8_t precac_chan)
{
- int agile_cac_timeout;
+ uint8_t first_subch, last_subch;
+
+ switch (chwidth) {
+ case CH_WIDTH_20MHZ:
+ first_subch = precac_chan;
+ last_subch = precac_chan;
+ break;
+ case CH_WIDTH_40MHZ:
+ first_subch = precac_chan - DFS_5GHZ_NEXT_CHAN_OFFSET;
+ last_subch = precac_chan + DFS_5GHZ_NEXT_CHAN_OFFSET;
+ break;
+ case CH_WIDTH_80MHZ:
+ first_subch = precac_chan - DFS_5GHZ_2ND_CHAN_OFFSET;
+ last_subch = precac_chan + DFS_5GHZ_2ND_CHAN_OFFSET;
+ break;
+ default:
+ dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,
+ "Precac channel width invalid!");
+ return false;
+ }
+ return FIND_IF_OVERLAP_WITH_WEATHER_RANGE(first_subch, last_subch);
+}
+
+void dfs_start_agile_precac_timer(struct wlan_dfs *dfs,
+ uint8_t ocac_status,
+ struct dfs_agile_cac_params *adfs_param)
+{
+ uint8_t precac_chan = adfs_param->precac_chan;
+ enum phy_ch_width chwidth = adfs_param->precac_chwidth;
+ uint32_t min_precac_timeout, max_precac_timeout;
struct dfs_soc_priv_obj *dfs_soc_obj;
dfs_soc_obj = dfs->dfs_soc_obj;
dfs_soc_obj->dfs_precac_timer_running = 1;
- agile_cac_timeout = (dfs->dfs_precac_timeout_override != -1) ?
- dfs->dfs_precac_timeout_override :
- DEFAULT_CAC_DURATION;
if (ocac_status == OCAC_SUCCESS) {
dfs_soc_obj->ocac_status = OCAC_SUCCESS;
- agile_cac_timeout = 0;
+ min_precac_timeout = 0;
+ max_precac_timeout = 0;
+ } else {
+ /* Find the minimum and maximum precac timeout. */
+ max_precac_timeout = MAX_PRECAC_DURATION;
+ if (dfs->dfs_precac_timeout_override != -1) {
+ min_precac_timeout =
+ dfs->dfs_precac_timeout_override * 1000;
+ } else if (dfs_is_precac_on_weather_channel(dfs,
+ chwidth,
+ precac_chan)) {
+ min_precac_timeout = MIN_WEATHER_PRECAC_DURATION;
+ max_precac_timeout = MAX_WEATHER_PRECAC_DURATION;
+ } else {
+ min_precac_timeout = MIN_PRECAC_DURATION;
+ }
}
dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
- "precactimeout = %d", (agile_cac_timeout) * 1000);
- qdf_timer_mod(&dfs_soc_obj->dfs_precac_timer,
- (agile_cac_timeout) * 1000);
+ "precactimeout = %d ms", (min_precac_timeout));
+ qdf_timer_mod(&dfs_soc_obj->dfs_precac_timer, min_precac_timeout);
+ adfs_param->min_precac_timeout = min_precac_timeout;
+ adfs_param->max_precac_timeout = max_precac_timeout;
}
#endif
@@ -2137,7 +2214,7 @@
return CH_WIDTH_80MHZ;
default:
dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "Invalid chwidth enum!");
- return 0;
+ return CH_WIDTH_INVALID;
}
}
@@ -2159,7 +2236,7 @@
*/
dfs_find_chwidth_and_center_chan(dfs, &chwidth, NULL, NULL);
dfs->dfs_precac_chwidth = dfs_find_agile_width(dfs, chwidth);
- if (!dfs->dfs_precac_chwidth) {
+ if (dfs->dfs_precac_chwidth == CH_WIDTH_INVALID) {
dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "cannot start agile CAC!");
return;
}
@@ -2172,15 +2249,10 @@
pri_ch_ieee,
sec_ch_ieee,
chwidth_val);
- if (ieee_chan) {
+ if (ieee_chan)
dfs->dfs_agile_precac_freq = ieee_chan;
- /* Start the pre_cac_timer */
- dfs_start_agile_precac_timer(dfs,
- dfs->dfs_agile_precac_freq,
- dfs->dfs_soc_obj->ocac_status);
- } else {
+ else
dfs->dfs_agile_precac_freq = 0;
- }
*ch_ieee = dfs->dfs_agile_precac_freq;
}
@@ -2322,7 +2394,7 @@
tx_ops = &psoc->soc_cb.tx_ops.target_tx_ops;
target_type = lmac_get_target_type(dfs->dfs_pdev_obj);
- tgt_hdl = (struct target_psoc_info *)wlan_psoc_get_tgt_if_handle(psoc);
+ tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
if (!tgt_hdl) {
dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "target_psoc_info is null");
return;
@@ -2374,16 +2446,12 @@
#ifdef QCA_SUPPORT_AGILE_DFS
void dfs_agile_precac_start(struct wlan_dfs *dfs)
{
- uint8_t agile_freq = 0;
+ struct dfs_agile_cac_params adfs_param;
uint8_t ocac_status = 0;
struct dfs_soc_priv_obj *dfs_soc_obj;
uint8_t cur_dfs_idx;
dfs_soc_obj = dfs->dfs_soc_obj;
- /*
- * Initiate first call to start preCAC here, for agile_freq as 0,
- * and ocac_status as 0
- */
qdf_info("%s : %d agile_precac_started: %d",
__func__, __LINE__,
@@ -2400,12 +2468,16 @@
dfs->dfs_soc_obj->dfs_priv[cur_dfs_idx].dfs);
if (!dfs->dfs_soc_obj->precac_state_started) {
+ /*
+ * Initiate first call to start preCAC here, for channel as 0,
+ * and ocac_status as 0
+ */
+ adfs_param.precac_chan = 0;
+ adfs_param.precac_chwidth = CH_WIDTH_INVALID;
qdf_info("%s : %d Initiated agile precac",
__func__, __LINE__);
dfs->dfs_soc_obj->precac_state_started = true;
- dfs_start_agile_precac_timer(dfs,
- agile_freq,
- ocac_status);
+ dfs_start_agile_precac_timer(dfs, ocac_status, &adfs_param);
}
}
#endif
@@ -2424,7 +2496,7 @@
retval = 0;
}
- tgt_hdl = (struct target_psoc_info *)wlan_psoc_get_tgt_if_handle(psoc);
+ tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
info = (struct tgt_info *)(&tgt_hdl->info);
if (!tgt_hdl) {
diff --git a/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm_actions.c b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm_actions.c
index 1b840a4..a9440d9 100644
--- a/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm_actions.c
+++ b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm_actions.c
@@ -289,6 +289,10 @@
wlan_pdev_mlme_op_clear(pdev, WLAN_PDEV_OP_MBSSID_RESTART);
wlan_pdev_mlme_op_clear(pdev, WLAN_PDEV_OP_RESTART_INPROGRESS);
+ qdf_mem_copy(&pdev_mlme->pdev_restart.restart_bmap,
+ &pdev_mlme->restart_send_vdev_bmap,
+ sizeof(pdev_mlme->pdev_restart.restart_bmap));
+
if (!wlan_pdev_nif_feat_cap_get(pdev,
WLAN_PDEV_F_MULTIVDEV_RESTART))
wlan_objmgr_pdev_iterate_obj_list
diff --git a/wmi/src/wmi_unified_non_tlv.c b/wmi/src/wmi_unified_non_tlv.c
index 172aaa7..20b83e6 100644
--- a/wmi/src/wmi_unified_non_tlv.c
+++ b/wmi/src/wmi_unified_non_tlv.c
@@ -911,6 +911,37 @@
}
/**
+ * send_peer_delete_all_cmd_non_tlv() - send PEER delete all command to fw
+ * @wmi_handle: wmi handle
+ * @vdev_id: vdev id
+ *
+ * Return: 0 for success or error code
+ */
+static QDF_STATUS send_peer_delete_all_cmd_non_tlv(wmi_unified_t wmi_handle,
+ struct peer_delete_all_params *param)
+{
+ wmi_vdev_delete_all_peer_cmd *cmd;
+ wmi_buf_t buf;
+ QDF_STATUS ret;
+ int len = sizeof(wmi_vdev_delete_all_peer_cmd);
+
+ buf = wmi_buf_alloc(wmi_handle, len);
+ if (!buf) {
+ WMI_LOGE("%s:wmi_buf_alloc failed", __func__);
+ return QDF_STATUS_E_NOMEM;
+ }
+ cmd = (wmi_vdev_delete_all_peer_cmd *)wmi_buf_data(buf);
+ cmd->vdev_id = param->vdev_id;
+ ret = wmi_unified_cmd_send(wmi_handle, buf, len,
+ WMI_VDEV_DELETE_ALL_PEER_CMDID);
+ if (QDF_IS_STATUS_ERROR(ret)) {
+ WMI_LOGE("Failed to send WMI_VDEV_DELETE_ALL_PEER_CMDID ");
+ wmi_buf_free(buf);
+ }
+ return ret;
+}
+
+/**
* convert_host_peer_param_id_to_target_id_non_tlv - convert host peer param_id
* to target id.
* @peer_param_id: host param id.
@@ -5383,79 +5414,6 @@
}
/**
- * send_pdev_set_chan_cmd_non_tlv() - send pdev set chan cmd to fw
- * @wmi_handle: wmi handle
- * @param: pointer to hold set chan param
- *
- * Return: 0 for success or error code
- */
-static QDF_STATUS
-send_pdev_set_chan_cmd_non_tlv(wmi_unified_t wmi_handle,
- struct channel_param *param)
-{
- wmi_set_channel_cmd *cmd;
- wmi_buf_t buf;
- QDF_STATUS ret;
- int len = sizeof(wmi_set_channel_cmd);
-
- buf = wmi_buf_alloc(wmi_handle, len);
- if (!buf) {
- WMI_LOGE("%s:wmi_buf_alloc failed", __func__);
- return QDF_STATUS_E_FAILURE;
- }
-
- cmd = (wmi_set_channel_cmd *)wmi_buf_data(buf);
-
- cmd->chan.mhz = param->mhz;
-
- WMI_SET_CHANNEL_MODE(&cmd->chan, param->phy_mode);
-
- cmd->chan.band_center_freq1 = param->cfreq1;
- cmd->chan.band_center_freq2 = param->cfreq2;
-
- WMI_SET_CHANNEL_MIN_POWER(&cmd->chan, param->minpower);
- WMI_SET_CHANNEL_MAX_POWER(&cmd->chan, param->maxpower);
- WMI_SET_CHANNEL_REG_POWER(&cmd->chan, param->maxregpower);
- WMI_SET_CHANNEL_ANTENNA_MAX(&cmd->chan, param->antennamax);
- WMI_SET_CHANNEL_REG_CLASSID(&cmd->chan, param->reg_class_id);
-
- if (param->dfs_set)
- WMI_SET_CHANNEL_FLAG(&cmd->chan, WMI_CHAN_FLAG_DFS);
-
- if (param->dfs_set_cfreq2)
- WMI_SET_CHANNEL_FLAG(&cmd->chan, WMI_CHAN_FLAG_DFS_CFREQ2);
-
- if (param->half_rate)
- WMI_SET_CHANNEL_FLAG(&cmd->chan, WMI_CHAN_FLAG_HALF);
-
- if (param->quarter_rate)
- WMI_SET_CHANNEL_FLAG(&cmd->chan, WMI_CHAN_FLAG_QUARTER);
-
- if ((param->phy_mode == MODE_11AC_VHT80_80) ||
- (param->phy_mode == MODE_11AC_VHT160)) {
- WMI_LOGD(
- "WMI channel freq=%d, mode=%x band_center_freq1=%d band_center_freq2=%d",
- cmd->chan.mhz,
- WMI_GET_CHANNEL_MODE(&cmd->chan), cmd->chan.band_center_freq1,
- cmd->chan.band_center_freq2);
- } else {
- WMI_LOGD("WMI channel freq=%d, mode=%x band_center_freq1=%d\n"
- , cmd->chan.mhz,
- WMI_GET_CHANNEL_MODE(&cmd->chan),
- cmd->chan.band_center_freq1);
- }
-
- ret = wmi_unified_cmd_send(wmi_handle, buf, len,
- WMI_PDEV_SET_CHANNEL_CMDID);
- if (QDF_IS_STATUS_ERROR(ret)) {
- WMI_LOGE("Failed to send WMI_PDEV_SET_CHANNEL_CMDID");
- wmi_buf_free(buf);
- }
-
- return ret;
-}
-
-/**
* send_mcast_group_update_cmd_non_tlv() - send mcast group update cmd to fw
* @wmi_handle: wmi handle
* @param: pointer to hold mcast update param
@@ -7359,6 +7317,34 @@
return QDF_STATUS_SUCCESS;
}
+/*
+ * extract_vdev_peer_delete_all_response_event_non_tlv() -
+ * extract peer delete all response event
+ * @wmi_handle: wmi handle
+ * @param evt_buf: pointer to event buffer
+ * @param pointer: Pointer to hold vdev_id of peer delete all response
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+static QDF_STATUS extract_vdev_peer_delete_all_response_event_non_tlv(
+ wmi_unified_t wmi_hdl,
+ void *evt_buf,
+ struct wmi_host_vdev_peer_delete_all_response_event *param)
+{
+ wmi_vdev_delete_all_peer_resp_event *ev;
+
+ ev = (wmi_vdev_delete_all_peer_resp_event *) evt_buf;
+ if (!ev) {
+ WMI_LOGE("%s: Invalid peer_delete all response", __func__);
+ return QDF_STATUS_E_FAILURE;
+ }
+
+ param->vdev_id = ev->vdev_id;
+ param->status = ev->status;
+
+ return QDF_STATUS_SUCCESS;
+}
+
/**
* extract_tbttoffset_num_vdevs_non_tlv() - extract tbtt offset num vdevs
* @wmi_handle: wmi handle
@@ -9921,6 +9907,7 @@
.send_vdev_up_cmd = send_vdev_up_cmd_non_tlv,
.send_peer_create_cmd = send_peer_create_cmd_non_tlv,
.send_peer_delete_cmd = send_peer_delete_cmd_non_tlv,
+ .send_peer_delete_all_cmd = send_peer_delete_all_cmd_non_tlv,
#ifdef WLAN_SUPPORT_GREEN_AP
.send_green_ap_ps_cmd = send_green_ap_ps_cmd_non_tlv,
#endif
@@ -9957,7 +9944,6 @@
.send_pdev_fips_cmd = send_pdev_fips_cmd_non_tlv,
.send_wlan_profile_enable_cmd = send_wlan_profile_enable_cmd_non_tlv,
.send_wlan_profile_trigger_cmd = send_wlan_profile_trigger_cmd_non_tlv,
- .send_pdev_set_chan_cmd = send_pdev_set_chan_cmd_non_tlv,
.send_set_ht_ie_cmd = send_set_ht_ie_cmd_non_tlv,
.send_set_vht_ie_cmd = send_set_vht_ie_cmd_non_tlv,
.send_wmm_update_cmd = send_wmm_update_cmd_non_tlv,
@@ -10083,6 +10069,8 @@
.extract_dcs_cw_int = extract_dcs_cw_int_non_tlv,
.extract_dcs_im_tgt_stats = extract_dcs_im_tgt_stats_non_tlv,
.extract_vdev_start_resp = extract_vdev_start_resp_non_tlv,
+ .extract_vdev_peer_delete_all_response_event =
+ extract_vdev_peer_delete_all_response_event_non_tlv,
.extract_tbttoffset_update_params =
extract_tbttoffset_update_params_non_tlv,
.extract_tbttoffset_num_vdevs =
@@ -10375,6 +10363,8 @@
WMI_SERVICE_UNAVAILABLE;
wmi_service[wmi_service_host_dfs_check_support] =
WMI_SERVICE_HOST_DFS_CHECK_SUPPORT;
+ wmi_service[wmi_service_vdev_delete_all_peer] =
+ WMI_SERVICE_VDEV_DELETE_ALL_PEER;
wmi_service[wmi_service_cfr_capture_support] =
WMI_SERVICE_CFR_CAPTURE_SUPPORT;
}
@@ -10488,6 +10478,8 @@
WMI_ESP_ESTIMATE_EVENTID;
event_ids[wmi_pdev_ctl_failsafe_check_event_id] =
WMI_PDEV_CTL_FAILSAFE_CHECK_EVENTID;
+ event_ids[wmi_peer_delete_all_response_event_id] =
+ WMI_VDEV_DELETE_ALL_PEER_RESP_EVENTID;
}
#endif