From 9e55b99378a07af6ee823672f2786b46e0da033a Mon Sep 17 00:00:00 2001 From: bings Date: Mon, 23 Mar 2020 14:47:53 +0800 Subject: [PATCH] qcacld-3.0: Notify channel info to kernel after channel switch After channel switch, driver should indicate new operation channel to kernel, otherwise wireless_dev->chandef still uses old channel whose status may become disable when radar is detected in the old channel. In hdd_chan_change_notify use frequency instead of channel number. Notify channel information to kernel after channel switch. Change-Id: I6dbf3d61978e4c35fe41b438397e635d62378719 CRs-Fixed: 2639076 --- core/hdd/src/wlan_hdd_assoc.c | 4 +- core/hdd/src/wlan_hdd_hostapd.c | 133 ++++++++++++++++---------------- core/sap/src/sap_fsm.c | 10 ++- 3 files changed, 79 insertions(+), 68 deletions(-) diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 8137424dc780..ca110ab34d6f 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -4600,9 +4600,9 @@ static void hdd_roam_channel_switch_handler(struct hdd_adapter *adapter, roam_info->chan_info.ch_width; chan_change.chan_params.sec_ch_offset = roam_info->chan_info.sec_ch_offset; - chan_change.chan_params.center_freq_seg0 = + chan_change.chan_params.mhz_freq_seg0 = roam_info->chan_info.band_center_freq1; - chan_change.chan_params.center_freq_seg1 = + chan_change.chan_params.mhz_freq_seg1 = roam_info->chan_info.band_center_freq2; bss = wlan_hdd_cfg80211_update_bss_db(adapter, roam_info); diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 41beb79690e4..d6bfb8b82602 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -885,9 +885,9 @@ QDF_STATUS hdd_chan_change_notify(struct hdd_adapter *adapter, break; case CH_WIDTH_80P80MHZ: chandef.width = NL80211_CHAN_WIDTH_80P80; - if (chan_change.chan_params.center_freq_seg1) - chandef.center_freq2 = cds_chan_to_freq( - chan_change.chan_params.center_freq_seg1); + if (chan_change.chan_params.mhz_freq_seg1) + chandef.center_freq2 = + chan_change.chan_params.mhz_freq_seg1; break; case CH_WIDTH_160MHZ: chandef.width = NL80211_CHAN_WIDTH_160; @@ -899,9 +899,9 @@ QDF_STATUS hdd_chan_change_notify(struct hdd_adapter *adapter, if ((chan_change.chan_params.ch_width == CH_WIDTH_80MHZ) || (chan_change.chan_params.ch_width == CH_WIDTH_80P80MHZ) || (chan_change.chan_params.ch_width == CH_WIDTH_160MHZ)) { - if (chan_change.chan_params.center_freq_seg0) - chandef.center_freq1 = cds_chan_to_freq( - chan_change.chan_params.center_freq_seg0); + if (chan_change.chan_params.mhz_freq_seg0) + chandef.center_freq1 = + chan_change.chan_params.mhz_freq_seg0; } hdd_debug("notify: chan:%d width:%d freq1:%d freq2:%d", @@ -1700,6 +1700,66 @@ static void hdd_hostapd_set_sap_key(struct hdd_adapter *adapter) wma_update_set_key(adapter->vdev_id, true, 0, crypto_key->cipher_type); } +/** + * hdd_hostapd_chan_change() - prepare new operation chan info to kernel + * @adapter: pointre to hdd_adapter + * @sap_event: pointer to sap_event + * + * Return: QDF_STATUS + */ +static QDF_STATUS hdd_hostapd_chan_change(struct hdd_adapter *adapter, + struct sap_event *sap_event) +{ + struct hdd_chan_change_params chan_change; + struct ch_params sap_ch_param = {0}; + eCsrPhyMode phy_mode; + bool legacy_phymode; + struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); + struct sap_ch_selected_s *sap_chan_selected = + &sap_event->sapevt.sap_ch_selected; + + sap_ch_param.ch_width = sap_chan_selected->ch_width; + sap_ch_param.mhz_freq_seg0 = + sap_chan_selected->vht_seg0_center_ch_freq; + sap_ch_param.mhz_freq_seg1 = + sap_chan_selected->vht_seg1_center_ch_freq; + + wlan_reg_set_channel_params_for_freq( + hdd_ctx->pdev, + sap_chan_selected->pri_ch_freq, + sap_chan_selected->ht_sec_ch_freq, + &sap_ch_param); + + phy_mode = wlan_sap_get_phymode( + WLAN_HDD_GET_SAP_CTX_PTR(adapter)); + + switch (phy_mode) { + case eCSR_DOT11_MODE_11n: + case eCSR_DOT11_MODE_11n_ONLY: + case eCSR_DOT11_MODE_11ac: + case eCSR_DOT11_MODE_11ac_ONLY: + case eCSR_DOT11_MODE_11ax: + case eCSR_DOT11_MODE_11ax_ONLY: + legacy_phymode = false; + break; + default: + legacy_phymode = true; + break; + } + + chan_change.chan_freq = sap_chan_selected->pri_ch_freq; + chan_change.chan_params.ch_width = sap_chan_selected->ch_width; + chan_change.chan_params.sec_ch_offset = + sap_ch_param.sec_ch_offset; + chan_change.chan_params.mhz_freq_seg0 = + sap_chan_selected->vht_seg0_center_ch_freq; + chan_change.chan_params.mhz_freq_seg1 = + sap_chan_selected->vht_seg1_center_ch_freq; + + return hdd_chan_change_notify(adapter, adapter->dev, + chan_change, legacy_phymode); +} + QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, void *context) { @@ -1727,13 +1787,9 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, uint8_t cc_len = WLAN_SVC_COUNTRY_CODE_LEN; struct hdd_adapter *con_sap_adapter; QDF_STATUS status = QDF_STATUS_SUCCESS; - struct hdd_chan_change_params chan_change; tSap_StationAssocReassocCompleteEvent *event; tSap_StationSetKeyCompleteEvent *key_complete; int ret = 0; - struct ch_params sap_ch_param = {0}; - eCsrPhyMode phy_mode; - bool legacy_phymode; tSap_StationDisassocCompleteEvent *disassoc_comp; struct hdd_station_info *stainfo, *cache_stainfo; uint8_t index = 0; @@ -2525,61 +2581,11 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, ap_ctx->sap_config.acs_cfg.ch_width = sap_event->sapevt.sap_ch_selected.ch_width; - sap_ch_param.ch_width = - sap_event->sapevt.sap_ch_selected.ch_width; - sap_ch_param.center_freq_seg0 = - wlan_reg_freq_to_chan( - hdd_ctx->pdev, - sap_event->sapevt.sap_ch_selected.vht_seg0_center_ch_freq); - - sap_ch_param.center_freq_seg1 = - wlan_reg_freq_to_chan( - hdd_ctx->pdev, - sap_event->sapevt.sap_ch_selected.vht_seg1_center_ch_freq); - wlan_reg_set_channel_params_for_freq( - hdd_ctx->pdev, - sap_event->sapevt.sap_ch_selected.pri_ch_freq, - sap_event->sapevt.sap_ch_selected.ht_sec_ch_freq, - &sap_ch_param); - cdp_hl_fc_set_td_limit(cds_get_context(QDF_MODULE_ID_SOC), adapter->vdev_id, ap_ctx->operating_chan_freq); - phy_mode = wlan_sap_get_phymode( - WLAN_HDD_GET_SAP_CTX_PTR(adapter)); - - switch (phy_mode) { - case eCSR_DOT11_MODE_11n: - case eCSR_DOT11_MODE_11n_ONLY: - case eCSR_DOT11_MODE_11ac: - case eCSR_DOT11_MODE_11ac_ONLY: - case eCSR_DOT11_MODE_11ax: - case eCSR_DOT11_MODE_11ax_ONLY: - legacy_phymode = false; - break; - default: - legacy_phymode = true; - break; - } - - chan_change.chan_freq = - sap_event->sapevt.sap_ch_selected.pri_ch_freq; - chan_change.chan_params.ch_width = - sap_event->sapevt.sap_ch_selected.ch_width; - chan_change.chan_params.sec_ch_offset = - sap_ch_param.sec_ch_offset; - chan_change.chan_params.center_freq_seg0 = - wlan_reg_freq_to_chan( - hdd_ctx->pdev, - sap_event->sapevt.sap_ch_selected.vht_seg0_center_ch_freq); - chan_change.chan_params.center_freq_seg1 = - wlan_reg_freq_to_chan( - hdd_ctx->pdev, - sap_event->sapevt.sap_ch_selected.vht_seg1_center_ch_freq); - - return hdd_chan_change_notify(adapter, dev, - chan_change, legacy_phymode); + return hdd_hostapd_chan_change(adapter, sap_event); case eSAP_ACS_SCAN_SUCCESS_EVENT: return hdd_handle_acs_scan_event(sap_event, adapter); @@ -2635,8 +2641,6 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, return QDF_STATUS_SUCCESS; case eSAP_CHANNEL_CHANGE_RESP: - hdd_debug("Channel change rsp status = %d", - sap_event->sapevt.ch_change_rsp_status); /* * Set the ch_switch_in_progress flag to zero and also enable * roaming once channel change process (success/failure) @@ -2656,8 +2660,7 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, hdd_ctx, adapter->vdev_id, adapter->session.ap.operating_chan_freq); - return QDF_STATUS_SUCCESS; - + return hdd_hostapd_chan_change(adapter, sap_event); default: hdd_debug("SAP message is not handled"); goto stopbss; diff --git a/core/sap/src/sap_fsm.c b/core/sap/src/sap_fsm.c index 653ee3e9e4c0..4fe665b036c2 100644 --- a/core/sap/src/sap_fsm.c +++ b/core/sap/src/sap_fsm.c @@ -1757,7 +1757,15 @@ QDF_STATUS sap_signal_hdd_event(struct sap_context *sap_ctx, case eSAP_CHANNEL_CHANGE_RESP: sap_ap_event.sapHddEventCode = eSAP_CHANNEL_CHANGE_RESP; - sap_ap_event.sapevt.ch_change_rsp_status = (QDF_STATUS)context; + acs_selected = &sap_ap_event.sapevt.sap_ch_selected; + acs_selected->pri_ch_freq = sap_ctx->chan_freq; + acs_selected->ht_sec_ch_freq = sap_ctx->sec_ch_freq; + acs_selected->ch_width = + sap_ctx->csr_roamProfile.ch_params.ch_width; + acs_selected->vht_seg0_center_ch_freq = + sap_ctx->csr_roamProfile.ch_params.mhz_freq_seg0; + acs_selected->vht_seg1_center_ch_freq = + sap_ctx->csr_roamProfile.ch_params.mhz_freq_seg1; QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, "In %s, SAP event callback event = %s", __func__, "eSAP_CHANNEL_CHANGE_RESP");