浏览代码

qcacmn: Reset super chan list and allow same power mode config

Consider the case where the AFC server response initially,
has only one 20 MHZ channel available for operation and AP is operating
on SP on that channel. In the next response, the AFC server response
advertises support for all UNII-5 and UNII-7 channel. In this case,
the AP VAP does not come up in the new channel chosen by ACS.

The super channel list is not being reset on every AFC response received
from the target. Also, if the current power mode is SP, and the target
power is also SP, reg_set_ap_pwr_and_update_chan_list does not the same
power mode configuration. Due to this, the current channel list and
super channel list are not updated, and therefore the VAP fails to come
up in the new channel chose by ACS.

To fix this issue, reset the super chan list on every AFC response
received and remove the check to prevent the same power mode setting
in reg_set_ap_pwr_and_update_chan_list.

Change-Id: I52f24038ef904e4f8ede6861b7e4a0cdcd9607b0
CRs-Fixed: 3154057
Hariharan Basuthkar 3 年之前
父节点
当前提交
49ce65bf57
共有 2 个文件被更改,包括 3 次插入4 次删除
  1. 3 1
      umac/regulatory/core/src/reg_build_chan_list.c
  2. 0 3
      umac/regulatory/core/src/reg_services_common.c

+ 3 - 1
umac/regulatory/core/src/reg_build_chan_list.c

@@ -1908,7 +1908,7 @@ static void reg_init_pdev_super_chan_list(
 {
 {
 	uint8_t i;
 	uint8_t i;
 
 
-	qdf_mem_zero(&pdev_priv_obj->super_chan_list,
+	qdf_mem_zero(pdev_priv_obj->super_chan_list, NUM_6GHZ_CHANNELS *
 		     sizeof(struct super_chan_info));
 		     sizeof(struct super_chan_info));
 	for (i = 0; i < NUM_6GHZ_CHANNELS; i++)
 	for (i = 0; i < NUM_6GHZ_CHANNELS; i++)
 		reg_init_super_chan_entry(pdev_priv_obj, i);
 		reg_init_super_chan_entry(pdev_priv_obj, i);
@@ -4100,6 +4100,8 @@ reg_process_afc_power_event(struct afc_regulatory_info *afc_info)
 		return QDF_STATUS_E_FAILURE;
 		return QDF_STATUS_E_FAILURE;
 	}
 	}
 
 
+	reg_init_pdev_super_chan_list(pdev_priv_obj);
+	reg_init_6g_master_chan(pdev_priv_obj->afc_chan_list, soc_reg);
 	/* Free the old power_info event if it was allocated */
 	/* Free the old power_info event if it was allocated */
 	if (pdev_priv_obj->power_info)
 	if (pdev_priv_obj->power_info)
 		reg_free_afc_pwr_info(pdev_priv_obj);
 		reg_free_afc_pwr_info(pdev_priv_obj);

+ 0 - 3
umac/regulatory/core/src/reg_services_common.c

@@ -7650,9 +7650,6 @@ QDF_STATUS reg_set_ap_pwr_and_update_chan_list(struct wlan_objmgr_pdev *pdev,
 		return QDF_STATUS_E_INVAL;
 		return QDF_STATUS_E_INVAL;
 	}
 	}
 
 
-	if (pdev_priv_obj->reg_cur_6g_ap_pwr_type == ap_pwr_type)
-		return QDF_STATUS_SUCCESS;
-
 	if (!reg_get_num_rules_of_ap_pwr_type(pdev, ap_pwr_type))
 	if (!reg_get_num_rules_of_ap_pwr_type(pdev, ap_pwr_type))
 		return QDF_STATUS_E_FAILURE;
 		return QDF_STATUS_E_FAILURE;