wlan: Event notification patch
A mechanism to send a custom event to wpa_supplicant in case of sub-system
restart because of DXE data stall. When DXE data stall happens there is a
re-initiation of RIVA after a recent change. Earlier there used to be reload
of driver and wpa_supplicant from framework. Now the older notification is
not going to wpa_supplicant anymore and hence this custom event will be
generated to notify wpa_supplicant. Motorola uses this event to collect
metrics and this change is specific for JB 2.5.2 branch.
Change-Id: I6bd3c4ca8b10c13705e640dbe88600e0c7700306
CRs-fixed: 476313
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 118a473..868f9e6 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -142,6 +142,8 @@
#define MEMORY_DEBUG_STR ""
#endif
+#define MAX_RESTART_DRIVER_EVENT_LENGTH 30
+
/* the Android framework expects this param even though we don't use it */
#define BUF_LEN 20
static char fwpath_buffer[BUF_LEN];
@@ -5989,18 +5991,8 @@
{
VOS_STATUS status = VOS_STATUS_SUCCESS;
hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
- int len = (sizeof (struct ieee80211_mgmt));
- struct ieee80211_mgmt *mgmt = NULL;
-
- /* Prepare the DEAUTH managment frame with reason code */
- mgmt = kzalloc(len, GFP_KERNEL);
- if(mgmt == NULL)
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
- "%s: memory allocation failed (%d bytes)", __func__, len);
- return VOS_STATUS_E_NOMEM;
- }
- mgmt->u.deauth.reason_code = WLAN_REASON_DISASSOC_LOW_ACK;
+ unsigned char restart_notification[MAX_RESTART_DRIVER_EVENT_LENGTH + 1];
+ union iwreq_data wrqu;
/* Iterate over all adapters/devices */
status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
@@ -6015,28 +6007,22 @@
pAdapterNode->pAdapter->dev->name,
pAdapterNode->pAdapter->device_mode,
pHddCtx->hdd_restart_retries + 1);
- /*
- * CFG80211 event to restart the driver
- *
- * 'cfg80211_send_unprot_deauth' sends a
- * NL80211_CMD_UNPROT_DEAUTHENTICATE event to supplicant at any state
- * of SME(Linux Kernel) state machine.
- *
- * Reason code WLAN_REASON_DISASSOC_LOW_ACK is currently used to restart
- * the driver.
- *
- */
-
- cfg80211_send_unprot_deauth(pAdapterNode->pAdapter->dev, (u_int8_t*)mgmt, len );
+
+ /* Notify the wpa supplicant of wcnss restart by sending the custom event */
+ memset(&wrqu, 0 , sizeof(wrqu));
+ memset(restart_notification, 0, sizeof(restart_notification));
+
+ strlcpy(restart_notification, "QCOM: RESTART_DRIVER_DXE", sizeof(restart_notification));
+
+ wrqu.data.pointer = restart_notification;
+ wrqu.data.length = strlen(restart_notification);
+
+ wireless_send_event(pAdapterNode->pAdapter->dev, IWEVCUSTOM, &wrqu, restart_notification);
}
status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
pAdapterNode = pNext;
} while((NULL != pAdapterNode) && (VOS_STATUS_SUCCESS == status));
-
- /* Free the allocated management frame */
- kfree(mgmt);
-
/* Retry until we unload or reach max count */
if(++pHddCtx->hdd_restart_retries < WLAN_HDD_RESTART_RETRY_MAX_CNT)
vos_timer_start(&pHddCtx->hdd_restart_timer, WLAN_HDD_RESTART_RETRY_DELAY_MS);