kernel-module-qualcomm: fix concurrency and p2p support

Fix support for concurrency and some P2P modes by initializing the interface
with all the adapter completion variables.

https://jira.digi.com/browse/DEL-3072
https://jira.digi.com/browse/DEL-3037

Signed-off-by: Isaac Hermida <isaac.hermida@digi.com>
This commit is contained in:
Isaac Hermida 2016-10-18 13:39:28 +02:00
parent 86cb5b15ae
commit f8c901b376
4 changed files with 262 additions and 0 deletions

View File

@ -32,6 +32,9 @@ SRC_URI = " \
file://0013-Kbuild-do-not-create-an-auxiliar-p2p-on-init.patch \
file://0014-Kbuild-do-not-compile-the-DEBUG-version-inconditiona.patch \
file://0015-Kbuild-Group-most-of-the-relevant-DEBUG-options.patch \
file://0016-wlan_hdd_cfg80211-fix-missing-ifdef-clause.patch \
file://0017-Add-.gitignore-rules.patch \
file://0018-wlan_hdd_main-initialize-all-adapter-completion-vari.patch \
"
S = "${WORKDIR}/${PV}"

View File

@ -0,0 +1,28 @@
From: Isaac Hermida <isaac.hermida@digi.com>
Date: Fri, 14 Oct 2016 10:28:29 +0200
Subject: [PATCH] wlan_hdd_cfg80211: fix missing ifdef clause
Fix the compilation for old kernels by defining a missing "ifdef" clause.
Signed-off-by: Isaac Hermida <isaac.hermida@digi.com>
---
CORE/HDD/inc/wlan_hdd_cfg80211.h | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h
index a40c55144bc5..95c1ddce7de4 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -992,7 +992,12 @@ backported_cfg80211_vendor_event_alloc(struct wiphy *wiphy,
int approxlen,
int event_idx, gfp_t gfp)
{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0)
return cfg80211_vendor_event_alloc(wiphy, wdev, approxlen, event_idx, gfp);
+#else
+ return cfg80211_vendor_event_alloc(wiphy, approxlen, event_idx, gfp);
+#endif
+
}
#define cfg80211_vendor_event_alloc backported_cfg80211_vendor_event_alloc
#endif

View File

@ -0,0 +1,25 @@
From: Isaac Hermida <isaac.hermida@digi.com>
Date: Mon, 17 Oct 2016 10:06:18 +0200
Subject: [PATCH] Add .gitignore rules
Signed-off-by: Isaac Hermida <isaac.hermida@digi.com>
---
.gitignore | 9 +++++++++
1 file changed, 9 insertions(+)
create mode 100644 .gitignore
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000000..9886b5284c3f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+*.o
+*.o.cmd
+.tmp_versions
+.*
+Module.symvers
+modules.order
+*.mod.c
+cscope.*
+wlan.ko

View File

@ -0,0 +1,206 @@
From: Isaac Hermida <isaac.hermida@digi.com>
Date: Tue, 5 Jul 2016 14:55:15 +0530
Subject: [PATCH] wlan_hdd_main: initialize all adapter completion variables
In order to change the p2p device mode, delete and add virtual_iface
followed by change_iface will be invoked. But in this case device mode
is changed by invoking change_iface method without invoking delete and
add virtual_iface functions resulting in kernel panic.
This is because, in latter case hdd_open_adapter will not be invoked
for the intended device mode. Hence uninitialized completion variables
will be used for further operations.
To mitigate this issue, Initialize all completion variables of
hdd_adapter_t structure during open adapter irrespective of adapter's
device mode.
https://jira.digi.com/browse/DEL-3072
https://jira.digi.com/browse/DEL-3037
(cherry-picked from 20ed76a8e436042590aa25acb33a2ba3d6d34250)
Signed-off-by: Isaac Hermida <isaac.hermida@digi.com>
---
CORE/HDD/inc/wlan_hdd_main.h | 1 +
CORE/HDD/src/wlan_hdd_hostapd.c | 10 -----
CORE/HDD/src/wlan_hdd_main.c | 82 ++++++++++++++++++++++++-----------------
3 files changed, 50 insertions(+), 43 deletions(-)
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index f01b7f309dc2..3c5a51a57d6c 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -1740,4 +1740,5 @@ static inline void wlan_hdd_stop_sap(hdd_adapter_t *ap_adapter) {}
static inline void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter) {}
#endif
bool wlan_hdd_get_fw_state(hdd_adapter_t *adapter);
+void hdd_initialize_adapter_common(hdd_adapter_t *adapter);
#endif // end #if !defined( WLAN_HDD_MAIN_H )
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 8a80d26f355a..4bd6b844ac5a 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -5389,9 +5389,6 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter )
return status;
}
- init_completion(&pAdapter->session_close_comp_var);
- init_completion(&pAdapter->session_open_comp_var);
-
sema_init(&(WLAN_HDD_GET_AP_CTX_PTR(pAdapter))->semWpsPBCOverlapInd, 1);
// Register as a wireless device
@@ -5494,13 +5491,6 @@ hdd_adapter_t* hdd_wlan_create_ap_dev( hdd_context_t *pHddCtx, tSirMacAddr macAd
pWlanHostapdDev->ieee80211_ptr = &pHostapdAdapter->wdev ;
pHostapdAdapter->wdev.wiphy = pHddCtx->wiphy;
pHostapdAdapter->wdev.netdev = pWlanHostapdDev;
- init_completion(&pHostapdAdapter->tx_action_cnf_event);
- init_completion(&pHostapdAdapter->cancel_rem_on_chan_var);
- init_completion(&pHostapdAdapter->rem_on_chan_ready_event);
- init_completion(&pHostapdAdapter->ula_complete);
- init_completion(&pHostapdAdapter->offchannel_tx_event);
- init_completion(&pHostapdAdapter->scan_info.scan_req_completion_event);
- init_completion(&pHostapdAdapter->scan_info.abortscan_event_var);
vos_event_init(&pHostapdAdapter->scan_info.scan_finished_event);
pHostapdAdapter->scan_info.scan_pending_option = WEXT_SCAN_PENDING_GIVEUP;
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index a10da2a9b164..b447f0931d52 100755
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -8234,7 +8234,6 @@ static hdd_adapter_t* hdd_alloc_station_adapter( hdd_context_t *pHddCtx, tSirMac
if(pWlanDev != NULL)
{
-
//Save the pointer to the net_device in the HDD adapter
pAdapter = (hdd_adapter_t*) netdev_priv( pWlanDev );
@@ -8244,43 +8243,11 @@ static hdd_adapter_t* hdd_alloc_station_adapter( hdd_context_t *pHddCtx, tSirMac
pAdapter->pHddCtx = pHddCtx;
pAdapter->magic = WLAN_HDD_ADAPTER_MAGIC;
- init_completion(&pAdapter->session_open_comp_var);
- init_completion(&pAdapter->session_close_comp_var);
- init_completion(&pAdapter->disconnect_comp_var);
- init_completion(&pAdapter->linkup_event_var);
- init_completion(&pAdapter->cancel_rem_on_chan_var);
- init_completion(&pAdapter->rem_on_chan_ready_event);
- init_completion(&pAdapter->offchannel_tx_event);
- init_completion(&pAdapter->tx_action_cnf_event);
-#ifdef FEATURE_WLAN_TDLS
- init_completion(&pAdapter->tdls_add_station_comp);
- init_completion(&pAdapter->tdls_del_station_comp);
- init_completion(&pAdapter->tdls_mgmt_comp);
- init_completion(&pAdapter->tdls_link_establish_req_comp);
-#endif
-
- init_completion(&pHddCtx->mc_sus_event_var);
- init_completion(&pHddCtx->tx_sus_event_var);
- init_completion(&pHddCtx->rx_sus_event_var);
- init_completion(&pHddCtx->ready_to_suspend);
- init_completion(&pAdapter->ula_complete);
- init_completion(&pAdapter->change_country_code);
-
-#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
- init_completion(&pHddCtx->ready_to_extwow);
-#endif
-
-#ifdef FEATURE_WLAN_BATCH_SCAN
- init_completion(&pAdapter->hdd_set_batch_scan_req_var);
- init_completion(&pAdapter->hdd_get_batch_scan_req_var);
pAdapter->pBatchScanRsp = NULL;
pAdapter->numScanList = 0;
pAdapter->batchScanState = eHDD_BATCH_SCAN_STATE_STOPPED;
pAdapter->prev_batch_id = 0;
mutex_init(&pAdapter->hdd_batch_scan_lock);
-#endif
- init_completion(&pAdapter->scan_info.scan_req_completion_event);
- init_completion(&pAdapter->scan_info.abortscan_event_var);
vos_event_init(&pAdapter->scan_info.scan_finished_event);
pAdapter->scan_info.scan_pending_option = WEXT_SCAN_PENDING_GIVEUP;
@@ -9018,6 +8985,7 @@ hdd_adapter_t* hdd_open_adapter( hdd_context_t *pHddCtx, tANI_U8 session_type,
pAdapter->wdev.iftype = NL80211_IFTYPE_P2P_CLIENT;
pAdapter->device_mode = session_type;
+ hdd_initialize_adapter_common(pAdapter);
status = hdd_init_station_mode( pAdapter );
if( VOS_STATUS_SUCCESS != status )
@@ -9089,6 +9057,7 @@ hdd_adapter_t* hdd_open_adapter( hdd_context_t *pHddCtx, tANI_U8 session_type,
NL80211_IFTYPE_P2P_GO;
pAdapter->device_mode = session_type;
+ hdd_initialize_adapter_common(pAdapter);
status = hdd_init_ap_mode(pAdapter);
if( VOS_STATUS_SUCCESS != status )
goto err_free_netdev;
@@ -9163,6 +9132,7 @@ hdd_adapter_t* hdd_open_adapter( hdd_context_t *pHddCtx, tANI_U8 session_type,
pAdapter->device_mode = session_type;
status = hdd_register_interface( pAdapter, rtnl_held );
+ hdd_initialize_adapter_common(pAdapter);
hdd_init_tx_rx( pAdapter );
//Stop the Interface TX queue.
@@ -11735,6 +11705,13 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc)
init_completion(&pHddCtx->full_pwr_comp_var);
init_completion(&pHddCtx->standby_comp_var);
init_completion(&pHddCtx->req_bmps_comp_var);
+ init_completion(&pHddCtx->mc_sus_event_var);
+ init_completion(&pHddCtx->tx_sus_event_var);
+ init_completion(&pHddCtx->rx_sus_event_var);
+ init_completion(&pHddCtx->ready_to_suspend);
+#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
+ init_completion(&pHddCtx->ready_to_extwow);
+#endif
spin_lock_init(&pHddCtx->schedScan_lock);
@@ -14494,6 +14471,45 @@ void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter)
}
#endif
+/**
+ * hdd_initialize_adapter_common() - initialize completion variables
+ * @adapter: pointer to hdd_adapter_t
+ *
+ * Return: none
+ */
+void hdd_initialize_adapter_common(hdd_adapter_t *adapter)
+{
+ if (NULL == adapter) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, "%s: adapter is NULL ", __func__);
+ return;
+ }
+ init_completion(&adapter->session_open_comp_var);
+ init_completion(&adapter->session_close_comp_var);
+ init_completion(&adapter->disconnect_comp_var);
+ init_completion(&adapter->linkup_event_var);
+ init_completion(&adapter->cancel_rem_on_chan_var);
+ init_completion(&adapter->rem_on_chan_ready_event);
+ init_completion(&adapter->offchannel_tx_event);
+ init_completion(&adapter->tx_action_cnf_event);
+#ifdef FEATURE_WLAN_TDLS
+ init_completion(&adapter->tdls_add_station_comp);
+ init_completion(&adapter->tdls_del_station_comp);
+ init_completion(&adapter->tdls_mgmt_comp);
+ init_completion(&adapter->tdls_link_establish_req_comp);
+#endif
+ init_completion(&adapter->ula_complete);
+ init_completion(&adapter->change_country_code);
+ init_completion(&adapter->scan_info.scan_req_completion_event);
+ init_completion(&adapter->scan_info.abortscan_event_var);
+
+#ifdef FEATURE_WLAN_BATCH_SCAN
+ init_completion(&adapter->hdd_set_batch_scan_req_var);
+ init_completion(&adapter->hdd_get_batch_scan_req_var);
+#endif
+
+ return;
+}
+
//Register the module init/exit functions
module_init(hdd_module_init);
module_exit(hdd_module_exit);