diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb index c59fe3693..17a2bdfbe 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb @@ -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}" diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0016-wlan_hdd_cfg80211-fix-missing-ifdef-clause.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0016-wlan_hdd_cfg80211-fix-missing-ifdef-clause.patch new file mode 100644 index 000000000..c5621575e --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0016-wlan_hdd_cfg80211-fix-missing-ifdef-clause.patch @@ -0,0 +1,28 @@ +From: Isaac Hermida +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 +--- + 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 diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0017-Add-.gitignore-rules.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0017-Add-.gitignore-rules.patch new file mode 100644 index 000000000..f29152d5c --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0017-Add-.gitignore-rules.patch @@ -0,0 +1,25 @@ +From: Isaac Hermida +Date: Mon, 17 Oct 2016 10:06:18 +0200 +Subject: [PATCH] Add .gitignore rules + +Signed-off-by: Isaac Hermida +--- + .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 diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0018-wlan_hdd_main-initialize-all-adapter-completion-vari.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0018-wlan_hdd_main-initialize-all-adapter-completion-vari.patch new file mode 100644 index 000000000..501d36add --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0018-wlan_hdd_main-initialize-all-adapter-completion-vari.patch @@ -0,0 +1,206 @@ +From: Isaac Hermida +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 +--- + 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);