summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRajesh Chauhan <rajeshc@qca.qualcomm.com>2014-02-26 00:09:50 -0800
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-02-27 10:58:08 -0800
commit63eb5f199d0c3f2ba383ccc8c156597fc2abae14 (patch)
tree5c76f46ba17192ba68aeb5b2be52ee91535ffa2e
parentfb84e4edc1409c93f863638b482b04ce648227af (diff)
qcacld: replace mutex_lock_interruptible with mutex_lock for tdls lock
Use mutex_lock instead of mutex_lock_interruptible to avoid race condition which can occur due to interrupts. Change-Id: Icb35c49430ee59de93a54efc4c93877a57a561a5 CRs-Fixed: 619910
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c38
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c14
-rw-r--r--CORE/HDD/src/wlan_hdd_tdls.c125
3 files changed, 40 insertions, 137 deletions
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 126e8297565c..e4a84526af05 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -3043,12 +3043,7 @@ int wlan_hdd_cfg80211_change_iface( struct wiphy *wiphy,
* protect the concurrent access for the Adapters by TDLS
* module.
*/
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return -EINVAL;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
#endif
//De-init the adapter.
hdd_stop_adapter( pHddCtx, pAdapter );
@@ -3181,12 +3176,7 @@ int wlan_hdd_cfg80211_change_iface( struct wiphy *wiphy,
* protect the concurrent access for the Adapters by TDLS
* module.
*/
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return -EINVAL;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
#endif
status = wlan_hdd_change_iface_to_sta_mode(ndev, type);
#ifdef FEATURE_WLAN_TDLS
@@ -3288,6 +3278,7 @@ static int wlan_hdd_tdls_add_station(struct wiphy *wiphy,
hdd_context_t *pHddCtx = wiphy_priv(wiphy);
VOS_STATUS status;
hddTdlsPeer_t *pTdlsPeer;
+ tANI_U16 numCurrTdlsPeers;
ENTER();
@@ -3362,12 +3353,15 @@ static int wlan_hdd_tdls_add_station(struct wiphy *wiphy,
/* first to check if we reached to maximum supported TDLS peer.
TODO: for now, return -EPERM looks working fine,
but need to check if any other errno fit into this category.*/
- if (HDD_MAX_NUM_TDLS_STA <= wlan_hdd_tdlsConnectedPeers(pAdapter))
+ numCurrTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
+ if (HDD_MAX_NUM_TDLS_STA <= numCurrTdlsPeers)
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s: " MAC_ADDRESS_STR
- " TDLS Max peer already connected. Request declined.",
- __func__, MAC_ADDR_ARRAY(mac));
+ " TDLS Max peer already connected. Request declined."
+ " Num of peers (%d), Max allowed (%d).",
+ __func__, MAC_ADDR_ARRAY(mac), numCurrTdlsPeers,
+ HDD_MAX_NUM_TDLS_STA);
goto error;
}
else
@@ -8711,6 +8705,7 @@ static int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *d
int max_sta_failed = 0;
int responder;
long rc;
+ tANI_U16 numCurrTdlsPeers;
if (NULL == pHddCtx || NULL == pHddCtx->cfg_ini)
{
@@ -8766,7 +8761,8 @@ static int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *d
if (SIR_MAC_TDLS_SETUP_REQ == action_code ||
SIR_MAC_TDLS_SETUP_RSP == action_code )
{
- if (HDD_MAX_NUM_TDLS_STA <= wlan_hdd_tdlsConnectedPeers(pAdapter))
+ numCurrTdlsPeers = wlan_hdd_tdlsConnectedPeers(pAdapter);
+ if (HDD_MAX_NUM_TDLS_STA <= numCurrTdlsPeers)
{
/* supplicant still sends tdls_mgmt(SETUP_REQ) even after
we return error code at 'add_station()'. Hence we have this
@@ -8776,8 +8772,9 @@ static int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *d
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s: " MAC_ADDRESS_STR
- " TDLS Max peer already connected. action %d declined.",
- __func__, MAC_ADDR_ARRAY(peer), action_code);
+ " TDLS Max peer already connected. action (%d) declined. Num of peers (%d), Max allowed (%d).",
+ __func__, MAC_ADDR_ARRAY(peer), action_code,
+ numCurrTdlsPeers, HDD_MAX_NUM_TDLS_STA);
goto error;
}
else
@@ -8787,8 +8784,9 @@ static int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *d
status_code = eSIR_MAC_UNSPEC_FAILURE_STATUS;
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s: " MAC_ADDRESS_STR
- " TDLS Max peer already connected send response status %d",
- __func__, MAC_ADDR_ARRAY(peer), status_code);
+ " TDLS Max peer already connected, send response status (%d). Num of peers (%d), Max allowed (%d).",
+ __func__, MAC_ADDR_ARRAY(peer), status_code,
+ numCurrTdlsPeers, HDD_MAX_NUM_TDLS_STA);
max_sta_failed = -EPERM;
/* fall through to send setup resp with failure status
code */
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index df9f59662cb7..95481a63edd6 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -7073,12 +7073,7 @@ hdd_adapter_t* hdd_open_adapter( hdd_context_t *pHddCtx, tANI_U8 session_type,
/* A Mutex Lock is introduced while changing/initializing the mode to
* protect the concurrent access for the Adapters by TDLS module.
*/
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return NULL;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
#endif
pAdapter->wdev.iftype = (session_type == WLAN_HDD_P2P_CLIENT) ?
@@ -7299,12 +7294,7 @@ VOS_STATUS hdd_close_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter,
/* A Mutex Lock is introduced while changing/initializing the mode to
* protect the concurrent access for the Adapters by TDLS module.
*/
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return VOS_STATUS_E_FAILURE;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
#endif
hdd_remove_adapter( pHddCtx, pAdapterNode );
diff --git a/CORE/HDD/src/wlan_hdd_tdls.c b/CORE/HDD/src/wlan_hdd_tdls.c
index 3b7b4082a106..05bc1e03a493 100644
--- a/CORE/HDD/src/wlan_hdd_tdls.c
+++ b/CORE/HDD/src/wlan_hdd_tdls.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -104,12 +104,7 @@ static v_VOID_t wlan_hdd_tdls_start_peer_discover_timer(tdlsCtx_t *pHddTdlsCtx,
if ( mutexLock )
{
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list: %d", __func__, __LINE__);
- return;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
}
pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pHddTdlsCtx->pAdapter);
@@ -153,12 +148,7 @@ static v_VOID_t wlan_hdd_tdls_discover_peer_cb( v_PVOID_t userData )
return;
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list : %d", __func__, __LINE__);
- return;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pHddTdlsCtx->pAdapter);
@@ -274,12 +264,7 @@ static v_VOID_t wlan_hdd_tdls_update_peer_cb( v_PVOID_t userData )
if (NULL == pHddCtx)
return;
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
for (i = 0; i < 256; i++) {
head = &pHddTdlsCtx->peer_list[i];
@@ -441,12 +426,7 @@ static v_VOID_t wlan_hdd_tdls_idle_cb( v_PVOID_t userData )
curr_peer->rx_pkt,
curr_peer->pHddTdlsCtx->threshold_config.idle_packet_n);
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
/* Check tx/rx statistics on this tdls link for recent activities and
* then decide whether to tear down the link or keep it.
@@ -492,12 +472,7 @@ static v_VOID_t wlan_hdd_tdls_discovery_timeout_peer_cb(v_PVOID_t userData)
if (NULL == pHddCtx)
return;
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return ;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
for (i = 0; i < 256; i++) {
head = &pHddTdlsCtx->peer_list[i];
@@ -985,13 +960,8 @@ hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter, u8 *mac)
return NULL;
}
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- vos_mem_free(peer);
- return NULL;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
+
pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
if (NULL == pHddTdlsCtx)
@@ -1090,12 +1060,7 @@ int wlan_hdd_tdls_recv_discovery_resp(hdd_adapter_t *pAdapter, u8 *mac)
if (pHddTdlsCtx->discovery_sent_cnt)
pHddTdlsCtx->discovery_sent_cnt--;
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return -1;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
@@ -1459,12 +1424,7 @@ hddTdlsPeer_t *wlan_hdd_tdls_find_peer(hdd_adapter_t *pAdapter, u8 *mac,
if ( mutexLock )
{
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return NULL;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
}
pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
if (NULL == pHddTdlsCtx)
@@ -1501,12 +1461,7 @@ hddTdlsPeer_t *wlan_hdd_tdls_find_all_peer(hdd_context_t *pHddCtx, u8 *mac)
hddTdlsPeer_t *curr_peer= NULL;
VOS_STATUS status = 0;
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return NULL;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
{
@@ -1654,12 +1609,7 @@ int wlan_hdd_tdls_get_all_peers(hdd_adapter_t *pAdapter, char *buf, int buflen)
buf += len;
buflen -= len;
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return init_len-buflen;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
if (NULL == pHddTdlsCtx) {
mutex_unlock(&pHddCtx->tdls_lock);
@@ -1696,12 +1646,7 @@ void wlan_hdd_tdls_connection_callback(hdd_adapter_t *pAdapter)
if ((NULL == pHddCtx) || (NULL == pHddTdlsCtx)) return;
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
"%s, update %d discover %d", __func__,
@@ -1738,12 +1683,8 @@ void wlan_hdd_tdls_disconnection_callback(hdd_adapter_t *pAdapter)
VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,"%s", __func__);
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
+
if (NULL == pHddTdlsCtx)
{
mutex_unlock(&pHddCtx->tdls_lock);
@@ -1773,12 +1714,7 @@ void wlan_hdd_tdls_increment_peer_count(hdd_adapter_t *pAdapter)
if (NULL == pHddCtx) return;
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
pHddCtx->connected_peer_count++;
wlan_hdd_tdls_check_power_save_prohibited(pAdapter);
@@ -1795,12 +1731,7 @@ void wlan_hdd_tdls_decrement_peer_count(hdd_adapter_t *pAdapter)
if (NULL == pHddCtx) return;
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
if (pHddCtx->connected_peer_count)
pHddCtx->connected_peer_count--;
@@ -1942,12 +1873,7 @@ hddTdlsPeer_t *wlan_hdd_tdls_is_progress(hdd_context_t *pHddCtx, u8 *mac, u8 ski
hddTdlsPeer_t *curr_peer= NULL;
VOS_STATUS status = 0;
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return NULL;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
@@ -2009,13 +1935,7 @@ void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx,
if (NULL == pHddCtx)
return;
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return;
- }
-
+ mutex_lock(&pHddCtx->tdls_lock);
if (pHddCtx->tdls_mode == tdls_mode)
{
@@ -2138,12 +2058,7 @@ static void wlan_hdd_tdls_pre_setup(struct work_struct *work)
pHddTdlsCtx->discovery_sent_cnt++;
- if (mutex_lock_interruptible(&pHddCtx->tdls_lock))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: unable to lock list", __func__);
- return;
- }
+ mutex_lock(&pHddCtx->tdls_lock);
wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);