Android Tethering can't been open(QCOM平台)

1. 问题描述

(1)Using the SD card to burn the version of KK.Wi-Fi tethering turn ON is OK.
(2)Using the SD card to burn the version of L. Wi-Fi tethering turn ON is OK.
(3)Plug in charge.
(4)Waiting for a few minutes. Wi-Fi tethering turn ON is fail.

When we restart the Phone that the problem will not reappear.


2. 问题分析

16:11:39.848 2 859:1185 KERN_ERR wireless/wcnss/wcnss_prealloc.c(86) [ 422.147325] wcnss: wcnss_prealloc_get: prealloc not available for size: 84480
16:11:39.856 2 859:1185 KERN_WARNING /android/kernel/mm/page_alloc.c(2063) [ 422.155532] WifiStateMachin: page allocation failure: order:5, mode:0x40d0
3.修改方案

diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 70fd0c7..899d0c9 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -190,9 +190,14 @@ static eHalStatus initSmeCmdList(tpAniSirGlobal pMac)
                                               &pMac->sme.smeCmdFreeList)))
         goto end;
  
-    pCmd = vos_mem_malloc(sizeof(tSmeCmd) * pMac->sme.totalSmeCmd);
+    pCmd = (tSmeCmd *) vos_mem_vmalloc(sizeof(tSmeCmd) * pMac->sme.totalSmeCmd);
      if ( NULL == pCmd )
+    {
+       VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+                 FL("fail to allocate memory %lu"),
+                    (unsigned long)(sizeof(tSmeCmd) * pMac->sme.totalSmeCmd));
         status = eHAL_STATUS_FAILURE;
+    }
      else
      {
         status = eHAL_STATUS_SUCCESS;
@@ -338,7 +343,7 @@ static eHalStatus freeSmeCmdList(tpAniSirGlobal pMac)
  
      if(NULL != pMac->sme.pSmeCmdBufAddr)
      {
-        vos_mem_free(pMac->sme.pSmeCmdBufAddr);
+        vos_mem_vfree(pMac->sme.pSmeCmdBufAddr);
          pMac->sme.pSmeCmdBufAddr = NULL;
      }
  
diff --git a/CORE/VOSS/inc/vos_memory.h b/CORE/VOSS/inc/vos_memory.h
index 85847d1..69e97d3 100644
--- a/CORE/VOSS/inc/vos_memory.h
+++ b/CORE/VOSS/inc/vos_memory.h
@@ -1,5 +1,5 @@
  /*
- * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
   *
   * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
   *
@@ -304,4 +304,32 @@ v_VOID_t vos_mem_dma_free( v_VOID_t *ptr );
    --------------------------------------------------------------------------*/
  v_VOID_t vos_mem_set_dma_ptr(unsigned char *dmaBuffer);
  #endif /* DMA_DIRECT_ACCESS */
+
+
+/*----------------------------------------------------------------------------
+
+  \brief vos_mem_vmalloc() - allocate memory which is virtually contiguous
+
+  Wrapper function for vmalloc
+
+  \param size memory size to be allocated
+
+  \return on success returns starting address of allocated memory or NULL
+
+  --------------------------------------------------------------------------*/
+v_VOID_t * vos_mem_vmalloc(v_SIZE_t size);
+
+/*----------------------------------------------------------------------------
+
+  \brief vos_mem_vfree() - free memory allocated by vmalloc
+
+  Wrapper function for vfree
+
+  \param address starting address of the memory to be freed
+
+  \return Nothing
+
+  --------------------------------------------------------------------------*/
+v_VOID_t vos_mem_vfree(void *addr);
+
  #endif // __VOSS_LOCK_H
diff --git a/CORE/VOSS/src/vos_memory.c b/CORE/VOSS/src/vos_memory.c
index 7690c1b..2db0ca6 100644
--- a/CORE/VOSS/src/vos_memory.c
+++ b/CORE/VOSS/src/vos_memory.c
@@ -1,5 +1,5 @@
  /*
- * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
   *
   * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
   *
@@ -58,6 +58,7 @@
   * ------------------------------------------------------------------------*/
  #include "vos_memory.h"
  #include "vos_trace.h"
+#include 
  
  #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
  #include 
@@ -337,6 +338,31 @@ v_VOID_t vos_mem_free( v_VOID_t *ptr )
  }
  #endif
  
+v_VOID_t * vos_mem_vmalloc(v_SIZE_t size)
+{
+    if (size == 0 || size >= (1024*1024))
+    {
+        VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+                  "%s invalid size: %u", __func__, size);
+        return NULL;
+    }
+
+    return vmalloc(size);
+}
+
+v_VOID_t vos_mem_vfree(void *addr)
+{
+    if (addr == NULL)
+    {
+        VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+                  "%s NULL address passed to free", __func__);
+        return;
+    }
+
+    vfree(addr);
+    return;
+}
+
  v_VOID_t vos_mem_set( v_VOID_t *ptr, v_SIZE_t numBytes, v_BYTE_t value )
  {
     if (ptr == NULL)
-- 





你可能感兴趣的:(Android,SoftAP,(Tethering),Android,BUG示例)