qcacld-3.0: Simplify pre-cac flush prevention

Change I875c2f14ffd54272fc9ea0df1cecc6dd1171e310 introduced an elaborate
workaround to prevent the pre-cac work from flushing itself during stop
adapter. Introduce a less complicated work around by simply checking if
the current adapter is the pre-cac adapter before flushing the pre-cac
work.

Change-Id: Ib3e0716f8d088d124e960dcd724f579fb39a3d74
CRs-Fixed: 2387173
このコミットが含まれているのは:
Dustin Brown
2019-01-24 11:53:08 -08:00
committed by nshrivas
コミット b4260d5e38
5個のファイルの変更31行の追加58行の削除

ファイルの表示

@@ -2132,14 +2132,6 @@ void hdd_deinit_adapter(struct hdd_context *hdd_ctx,
QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter);
enum hdd_adapter_stop_flag_t {
HDD_IN_CAC_WORK_TH_CONTEXT = 0x00000001,
};
QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter,
enum hdd_adapter_stop_flag_t flag);
void hdd_set_station_ops(struct net_device *dev);
/**

ファイルの表示

@@ -1025,32 +1025,6 @@ static int wlan_hdd_set_pre_cac_complete_status(struct hdd_adapter *ap_adapter,
return 0;
}
/**
* hdd_check_adapter() - check adapter existing or not
* @adapter: adapter
*
* Check adapter in the hdd global list or not
*
* Return: true if adapter exists.
*/
static bool hdd_check_adapter(struct hdd_adapter *adapter)
{
struct hdd_adapter *temp;
struct hdd_context *hdd_ctx;
hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
if (!hdd_ctx) {
hdd_err("HDD context is null");
return false;
}
hdd_for_each_adapter(hdd_ctx, temp) {
if (temp == adapter)
return true;
}
return false;
}
/**
* __wlan_hdd_sap_pre_cac_failure() - Process the pre cac failure
* @data: AP adapter
@@ -1067,8 +1041,7 @@ static void __wlan_hdd_sap_pre_cac_failure(void *data)
hdd_enter();
adapter = (struct hdd_adapter *) data;
if (!adapter || !hdd_check_adapter(adapter) ||
adapter->magic != WLAN_HDD_ADAPTER_MAGIC) {
if (!adapter || adapter->magic != WLAN_HDD_ADAPTER_MAGIC) {
hdd_err("SAP Pre CAC adapter invalid");
return;
}
@@ -1079,9 +1052,8 @@ static void __wlan_hdd_sap_pre_cac_failure(void *data)
return;
}
wlan_hdd_release_intf_addr(hdd_ctx,
adapter->mac_addr.bytes);
hdd_stop_adapter_ext(hdd_ctx, adapter, HDD_IN_CAC_WORK_TH_CONTEXT);
wlan_hdd_release_intf_addr(hdd_ctx, adapter->mac_addr.bytes);
hdd_stop_adapter(hdd_ctx, adapter);
hdd_close_adapter(hdd_ctx, adapter, false);
}
@@ -1118,8 +1090,7 @@ static void wlan_hdd_sap_pre_cac_success(void *data)
hdd_enter();
adapter = (struct hdd_adapter *) data;
if (!adapter || !hdd_check_adapter(adapter) ||
adapter->magic != WLAN_HDD_ADAPTER_MAGIC) {
if (!adapter || adapter->magic != WLAN_HDD_ADAPTER_MAGIC) {
hdd_err("SAP Pre CAC adapter invalid");
return;
}
@@ -1131,9 +1102,8 @@ static void wlan_hdd_sap_pre_cac_success(void *data)
}
cds_ssr_protect(__func__);
wlan_hdd_release_intf_addr(hdd_ctx,
adapter->mac_addr.bytes);
hdd_stop_adapter_ext(hdd_ctx, adapter, HDD_IN_CAC_WORK_TH_CONTEXT);
wlan_hdd_release_intf_addr(hdd_ctx, adapter->mac_addr.bytes);
hdd_stop_adapter(hdd_ctx, adapter);
hdd_close_adapter(hdd_ctx, adapter, false);
cds_ssr_unprotect(__func__);

ファイルの表示

@@ -5377,16 +5377,10 @@ void wlan_hdd_reset_prob_rspies(struct hdd_adapter *adapter)
QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter)
{
return hdd_stop_adapter_ext(hdd_ctx, adapter, 0);
}
QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter,
enum hdd_adapter_stop_flag_t flag)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct hdd_station_ctx *sta_ctx;
struct sap_context *sap_ctx;
struct csr_roam_profile *roam_profile;
union iwreq_data wrqu;
tSirUpdateIE updateIE;
@@ -5539,8 +5533,11 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
ucfg_ipa_flush(hdd_ctx->pdev);
if (!(flag & HDD_IN_CAC_WORK_TH_CONTEXT))
/* don't flush pre-cac destroy if we are destroying pre-cac */
sap_ctx = WLAN_HDD_GET_SAP_CTX_PTR(adapter);
if (!wlan_sap_is_pre_cac_context(sap_ctx))
cds_flush_work(&hdd_ctx->sap_pre_cac_work);
/* fallthrough */
case QDF_P2P_GO_MODE:

ファイルの表示

@@ -643,15 +643,15 @@ typedef struct sSapDfsInfo {
uint16_t reduced_beacon_interval;
} tSapDfsInfo;
typedef struct tagSapCtxList {
struct sap_ctx_list {
void *sap_context;
enum QDF_OPMODE sapPersona;
} tSapCtxList, tpSapCtxList;
};
typedef struct tagSapStruct {
/* Information Required for SAP DFS Master mode */
tSapDfsInfo SapDfsInfo;
tSapCtxList sapCtxList[SAP_MAX_NUM_SESSION];
struct sap_ctx_list sapCtxList[SAP_MAX_NUM_SESSION];
#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
bool sap_channel_avoidance;
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
@@ -882,6 +882,14 @@ QDF_STATUS wlan_sap_set_chan_before_pre_cac(struct sap_context *sap_ctx,
QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx,
bool status);
/**
* wlan_sap_is_pre_cac_context() - checks if @context is for a pre-cac adapter
* @context: the SAP context to check
*
* Return: true if @context is for a pre-cac adapter
*/
bool wlan_sap_is_pre_cac_context(struct sap_context *context);
bool wlan_sap_is_pre_cac_active(mac_handle_t handle);
QDF_STATUS wlan_sap_get_pre_cac_vdev_id(mac_handle_t handle, uint8_t *vdev_id);
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH

ファイルの表示

@@ -1518,6 +1518,11 @@ QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx,
return QDF_STATUS_SUCCESS;
}
bool wlan_sap_is_pre_cac_context(struct sap_context *context)
{
return context && context->is_pre_cac_on;
}
/**
* wlan_sap_is_pre_cac_active() - Checks if pre cac in in progress
* @handle: Global MAC handle
@@ -1529,6 +1534,7 @@ QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx,
bool wlan_sap_is_pre_cac_active(mac_handle_t handle)
{
struct mac_context *mac = NULL;
struct sap_ctx_list *ctx_list;
int i;
mac = MAC_CONTEXT(handle);
@@ -1538,12 +1544,12 @@ bool wlan_sap_is_pre_cac_active(mac_handle_t handle)
return false;
}
ctx_list = mac->sap.sapCtxList;
for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
struct sap_context *context =
mac->sap.sapCtxList[i].sap_context;
if (context && context->is_pre_cac_on)
if (wlan_sap_is_pre_cac_context(ctx_list[i].sap_context))
return true;
}
return false;
}