wlan: Monitor Mode.

This change contains
1)interaction with user using iwpriv commands.
2)interaction with firmware using WDI req/resp
 in case of monitor mode.
3)Start req send to firmware will share the
  monitor mode configuration with firmware
 as per user request.

Change-Id: Iba823320f1a111910d8c8094aca5723640d1eb9c
CRs-Fixed: 816464
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index aa80d4d..8d18a9d 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -1522,7 +1522,9 @@
 tANI_U8* wlan_hdd_get_intf_addr(hdd_context_t* pHddCtx);
 void wlan_hdd_release_intf_addr(hdd_context_t* pHddCtx, tANI_U8* releaseAddr);
 v_U8_t hdd_get_operating_channel( hdd_context_t *pHddCtx, device_mode_t mode );
-
+void wlan_hdd_mon_set_typesubtype( hdd_mon_ctx_t *pMonCtx,int type);
+VOS_STATUS wlan_hdd_mon_poststartmsg( hdd_mon_ctx_t *pMonCtx );
+void wlan_hdd_mon_poststopmsg( void );
 void hdd_set_conparam ( v_UINT_t newParam );
 tVOS_CON_MODE hdd_get_conparam( void );
 
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 7bea316..80dd5cb 100755
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -8196,6 +8196,52 @@
    spin_unlock(&hdd_context_lock);
 }
 
+void wlan_hdd_mon_set_typesubtype( hdd_mon_ctx_t *pMonCtx,int type)
+{
+   pMonCtx->typeSubtypeBitmap = 0;
+   if( type%10 ) /* Management Packets */
+     pMonCtx->typeSubtypeBitmap |= 0xFFFF;
+   type/=10;
+   if( type%10 ) /* Control Packets */
+     pMonCtx->typeSubtypeBitmap |= 0xFFFF0000;
+   type/=10;
+   if( type%10 ) /* Data Packets */
+     pMonCtx->typeSubtypeBitmap |= 0xFFFF00000000;
+}
+
+VOS_STATUS wlan_hdd_mon_poststartmsg( hdd_mon_ctx_t *pMonCtx )
+{
+    vos_msg_t    monMsg;
+
+    monMsg.type = WDA_MON_START_REQ;
+    monMsg.reserved = 0;
+    monMsg.bodyptr = (v_U8_t*)pMonCtx;
+    monMsg.bodyval = 0;
+
+    if (VOS_STATUS_SUCCESS != vos_mq_post_message(
+        VOS_MODULE_ID_WDA,(vos_msg_t *)&monMsg)) {
+        hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
+        return VOS_STATUS_E_FAILURE;
+    }
+
+   return VOS_STATUS_SUCCESS;
+}
+
+void wlan_hdd_mon_poststopmsg(void)
+{
+    vos_msg_t    monMsg;
+
+    monMsg.type = WDA_MON_STOP_REQ;
+    monMsg.reserved = 0;
+    monMsg.bodyptr = NULL;
+    monMsg.bodyval = 0;
+
+    if (VOS_STATUS_SUCCESS != vos_mq_post_message(
+        VOS_MODULE_ID_WDA,(vos_msg_t *)&monMsg)) {
+        hddLog(VOS_TRACE_LEVEL_ERROR,"%s: : Failed to post Msg to HAL",__func__);
+    }
+}
+
 void wlan_hdd_mon_close(hdd_context_t *pHddCtx)
 {
     VOS_STATUS vosStatus;
@@ -8208,6 +8254,8 @@
         VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:pAdapter is NULL",__func__);
         return ;
     }
+
+   wlan_hdd_mon_poststopmsg();
    hdd_UnregisterWext(pAdapter->dev);
 
    vos_mon_stop( pVosContext );
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 087e9cd..83be8ea 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -171,7 +171,7 @@
 #define  WE_SET_TDLS_2040_BSS_COEXISTENCE 20
 #endif
 #define  WE_SET_RTS_CTS_HTVHT             21
-
+#define  WE_SET_MONITOR_STATE             22
 
 /* Private ioctls and their sub-ioctls */
 #define WLAN_PRIV_SET_NONE_GET_INT    (SIOCIWFIRSTPRIV + 1)
@@ -256,6 +256,8 @@
 
 #define WE_MTRACE_DUMP_CMD    8
 #define WE_MTRACE_SELECTIVE_MODULE_LOG_ENABLE_CMD    9
+#define WE_CONFIGURE_MONITOR_MODE  10
+#define WE_SET_MONITOR_MODE_FILTER  11
 
 #ifdef FEATURE_WLAN_TDLS
 #undef  MAX_VAR_ARGS
@@ -5364,6 +5366,7 @@
     tHalHandle hHal;
     hdd_wext_state_t  *pWextState;
     hdd_context_t *pHddCtx;
+    hdd_mon_ctx_t *pMonCtx = NULL;
     int *value = (int *)extra;
     int sub_cmd = value[0];
     int set_value = value[1];
@@ -5894,6 +5897,24 @@
            }
            break;
         }
+        case WE_SET_MONITOR_STATE:
+        {
+
+           pMonCtx =  WLAN_HDD_GET_MONITOR_CTX_PTR(pAdapter);
+           if( pMonCtx == NULL )
+           {
+             hddLog(LOGE, "Monitor Context NULL");
+             break;
+           }
+           pMonCtx->state = set_value;
+           if( set_value )
+               wlan_hdd_mon_poststartmsg(pMonCtx);
+           else
+               wlan_hdd_mon_poststopmsg();
+
+          break;
+        }
+
         default:
         {
             hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
@@ -7141,8 +7162,10 @@
     int sub_cmd;
     int *apps_args = (int *) extra;
     hdd_station_ctx_t *pStaCtx = NULL ;
+    hdd_mon_ctx_t *pMonCtx = NULL;
     hdd_context_t *pHddCtx = NULL;
     hdd_ap_ctx_t  *pAPCtx = NULL;
+    v_CONTEXT_t pVosContext;
     int cmd = 0;
     int staId = 0;
     int ret = 0;
@@ -7161,6 +7184,7 @@
                   "%s: Adapter is NULL",__func__);
         return -EINVAL;
     }
+    pVosContext = ( WLAN_HDD_GET_CTX(pAdapter))->pvosContext;
     pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
     ret = wlan_hdd_validate_context(pHddCtx);
     if (0 != ret)
@@ -7301,6 +7325,66 @@
             }
         break;
 #endif
+        case WE_CONFIGURE_MONITOR_MODE:
+           {
+               pMonCtx =  WLAN_HDD_GET_MONITOR_CTX_PTR(pAdapter);
+               if( pMonCtx == NULL )
+               {
+                 hddLog(LOGE, "Monitor Context NULL");
+                 break;
+               }
+               hddLog(LOG1, "%s: Monitor MOde Configuration: ChNo=%d ChBW=%d CRCCheck=%d type=%d ConversionBit=%d",
+                        __func__, apps_args[0], apps_args[1], apps_args[2],
+                        apps_args[3], apps_args[4]);
+               /* Input Validation part of FW */
+               pMonCtx->ChannelNo = apps_args[0];
+               pMonCtx->ChannelBW = apps_args[1];
+               pMonCtx->crcCheckEnabled = apps_args[2];
+               wlan_hdd_mon_set_typesubtype( pMonCtx,apps_args[3]);
+               pMonCtx->is80211to803ConReq = apps_args[4];
+               WLANTL_SetIsConversionReq(pVosContext,apps_args[4]);
+               if( pMonCtx->is80211to803ConReq )
+                    pAdapter->dev->type = ARPHRD_ETHER;
+               else
+                    pAdapter->dev->type = ARPHRD_IEEE80211_RADIOTAP;
+               if( (apps_args[3]!= 100 && apps_args[3]!= 0) && apps_args[4] )
+               {
+                  hddLog(LOGE, "%s: Filtering data packets as management and control"
+                         " cannot be converted to 802.3 ",__func__);
+                  pMonCtx->typeSubtypeBitmap = 0xFFFF00000000;
+               }
+               if( pMonCtx->state )
+                    wlan_hdd_mon_poststartmsg(pMonCtx);
+           }
+         break;
+
+        case WE_SET_MONITOR_MODE_FILTER:
+           {
+               pMonCtx =  WLAN_HDD_GET_MONITOR_CTX_PTR(pAdapter);
+               if( pMonCtx == NULL )
+               {
+                  hddLog(LOGE, "Monitor Context NULL");
+                  break;
+               }
+               /* Input Validation Part of FW */
+               pMonCtx->numOfMacFilters=1;
+               pMonCtx->mmFilters[0].macAddr.bytes[0]=apps_args[0];
+               pMonCtx->mmFilters[0].macAddr.bytes[1]=apps_args[1];
+               pMonCtx->mmFilters[0].macAddr.bytes[2]=apps_args[2];
+               pMonCtx->mmFilters[0].macAddr.bytes[3]=apps_args[3];
+               pMonCtx->mmFilters[0].macAddr.bytes[4]=apps_args[4];
+               pMonCtx->mmFilters[0].macAddr.bytes[5]=apps_args[5];
+               pMonCtx->mmFilters[0].isA1filter = apps_args[6];
+               pMonCtx->mmFilters[0].isA2filter = apps_args[7];
+               pMonCtx->mmFilters[0].isA3filter = apps_args[8];
+               hddLog(LOG1, "%s: Monitor Filter: %pM A1=%d A2=%d A3=%d ",
+                        __func__, pMonCtx->mmFilters[0].macAddr.bytes,
+                       apps_args[6], apps_args[7], apps_args[8]);
+               if( pMonCtx->state )
+                    wlan_hdd_mon_poststartmsg(pMonCtx);
+           }
+         break;
+
         default:
             {
                 hddLog(LOGE, "%s: Invalid IOCTL command %d",
@@ -10026,6 +10110,10 @@
 /*Maximum command length can be only 15 */
 static const struct iw_priv_args we_private_args[] = {
 
+    {   WE_SET_MONITOR_STATE,
+        IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+        0, "monitor" },
+
     /* handlers for main ioctl */
     {   WLAN_PRIV_SET_INT_GET_NONE,
         IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
@@ -10433,6 +10521,18 @@
        "setTdlsConfig" },
 #endif
 
+   {
+       WE_CONFIGURE_MONITOR_MODE,
+       IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
+       0,
+       "MonitorModeConf" },
+
+   {
+       WE_SET_MONITOR_MODE_FILTER,
+       IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
+       0,
+       "MonitorFilter" },
+
     /* handlers for main ioctl */
     {   WLAN_PRIV_ADD_TSPEC,
         IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | HDD_WLAN_WMM_PARAM_COUNT,
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index b7ff619..fd711be 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -709,6 +709,8 @@
 #define SIR_HAL_NAN_REQUEST                   (SIR_HAL_ITC_MSG_TYPES_BEGIN + 267)
 
 #define SIR_HAL_SET_RTS_CTS_HTVHT            (SIR_HAL_ITC_MSG_TYPES_BEGIN + 268)
+#define SIR_HAL_MON_START_REQ               (SIR_HAL_ITC_MSG_TYPES_BEGIN + 269)
+#define SIR_HAL_MON_STOP_REQ                (SIR_HAL_ITC_MSG_TYPES_BEGIN + 270)
 
 #define SIR_HAL_MSG_TYPES_END              (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
 // CFG message types
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 2671fd8..719dcc1 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1248,6 +1248,8 @@
 
 #define WDA_FW_STATS_GET_REQ                   SIR_HAL_FW_STATS_GET_REQ
 #define WDA_SET_RTS_CTS_HTVHT                   SIR_HAL_SET_RTS_CTS_HTVHT
+#define WDA_MON_START_REQ                      SIR_HAL_MON_START_REQ
+#define WDA_MON_STOP_REQ                       SIR_HAL_MON_STOP_REQ
 
 tSirRetStatus wdaPostCtrlMsg(tpAniSirGlobal pMac, tSirMsgQ *pMsg);
 
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 453d6a9..7957ca9 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -260,6 +260,8 @@
                          tANI_U32 val);
 
 
+VOS_STATUS WDA_ProcessMonStartReq( tWDA_CbContext *pWDA, void* wdaRequest);
+VOS_STATUS WDA_ProcessMonStopReq( tWDA_CbContext *pWDA, void* wdaRequest);
 /*
  * FUNCTION: WDA_ProcessNanRequest
  * Process NAN request
@@ -14143,6 +14145,18 @@
          WDA_ProcessSetRtsCtsHTVhtInd( pWDA, pMsg->bodyval);
          break;
       }
+
+      case WDA_MON_START_REQ:
+      {
+         WDA_ProcessMonStartReq(pWDA,(v_PVOID_t)pMsg->bodyptr);
+         break;
+      }
+      case WDA_MON_STOP_REQ:
+      {
+         WDA_ProcessMonStopReq(pWDA,NULL);
+         break;
+      }
+
       default:
       {
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
@@ -19044,3 +19058,107 @@
     }
     return CONVERT_WDI2VOS_STATUS(status) ;
 }
+void WDA_MonStartRspCallback(void *pEventData, void* pUserData)
+{
+   tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+
+   VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+                                          "<------ %s " ,__func__);
+   if (NULL == pWdaParams)
+   {
+      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+              "%s: pWdaParams received NULL", __func__);
+      VOS_ASSERT(0) ;
+      return ;
+   }
+
+   vos_mem_free(pWdaParams) ;
+
+   return;
+}
+
+
+VOS_STATUS WDA_ProcessMonStartReq( tWDA_CbContext *pWDA, void* wdaRequest)
+{
+
+    WDI_Status status = WDI_STATUS_SUCCESS;
+    tWDA_ReqParams *pWdaParams;
+
+    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+            FL("%s: "), __func__);
+    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
+    if (NULL == pWdaParams)
+    {
+        VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+            FL("%s: VOS MEM Alloc Failure"), __func__);
+        VOS_ASSERT(0);
+        return VOS_STATUS_E_NOMEM;
+    }
+    pWdaParams->pWdaContext = pWDA;
+    pWdaParams->wdaMsgParam = wdaRequest;
+    pWdaParams->wdaWdiApiMsgParam = NULL;
+
+    status = WDI_MonStartReq((void *)wdaRequest,
+                               (WDI_MonStartRspCb)WDA_MonStartRspCallback,
+                               (void *)pWdaParams);
+    if (IS_WDI_STATUS_FAILURE(status))
+    {
+        VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                   "Failure to request.  Free all the memory " );
+        vos_mem_free(pWdaParams->wdaMsgParam);
+        vos_mem_free(pWdaParams);
+    }
+    return CONVERT_WDI2VOS_STATUS(status);
+}
+
+void WDA_MonStopRspCallback(void* pUserData)
+{
+   tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+
+   VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+                                          "<------ %s " ,__func__);
+   if (NULL == pWdaParams)
+   {
+      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+              "%s: pWdaParams received NULL", __func__);
+      VOS_ASSERT(0) ;
+      return ;
+   }
+
+   vos_mem_free(pWdaParams) ;
+
+   return;
+}
+
+VOS_STATUS WDA_ProcessMonStopReq( tWDA_CbContext *pWDA, void* wdaRequest)
+{
+
+    WDI_Status status = WDI_STATUS_SUCCESS;
+    tWDA_ReqParams *pWdaParams;
+
+    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+            FL("%s: "), __func__);
+    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
+    if (NULL == pWdaParams)
+    {
+        VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+            FL("%s: VOS MEM Alloc Failure"), __func__);
+        VOS_ASSERT(0);
+        return VOS_STATUS_E_NOMEM;
+    }
+    pWdaParams->pWdaContext = pWDA;
+    pWdaParams->wdaMsgParam = wdaRequest;
+    pWdaParams->wdaWdiApiMsgParam = NULL;
+
+    status = WDI_MonStopReq((WDI_MonStopRspCb)WDA_MonStopRspCallback,
+                             (void *)pWdaParams);
+
+    if (IS_WDI_STATUS_FAILURE(status))
+    {
+        VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                   "Failure to request.  Free all the memory " );
+        vos_mem_free(pWdaParams->wdaMsgParam);
+        vos_mem_free(pWdaParams);
+    }
+    return CONVERT_WDI2VOS_STATUS(status);
+}
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index 5052932..c1d9ac1 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -6065,6 +6065,31 @@
     wpt_payload data;
 }wpt_pkt80211;
 
+#define NUM_FILTERS_SUPPORTED 1
+typedef struct
+{
+   wpt_macAddr macAddr;
+   wpt_uint8 isA1filter;
+   wpt_uint8 isA2filter;
+   wpt_uint8 isA3filter;
+}WDI_filter;
+
+typedef struct
+{
+   /* start or stop */
+   wpt_uint8 state;
+   /*Conversion of packet required or not*/
+   wpt_uint8 is80211to803ConReq;
+   wpt_uint32 ChannelNo;
+   wpt_uint32 ChannelBW;
+   wpt_uint8 crcCheckEnabled;
+   wpt_uint8 numOfMacFilters;
+   WDI_filter mmFilters[NUM_FILTERS_SUPPORTED];
+   wpt_uint64 typeSubtypeBitmap;
+   wpt_uint64 rsvd;
+
+}WDI_MonStartReqType;
+
 /*----------------------------------------------------------------------------
  *   WDI callback types
  *--------------------------------------------------------------------------*/
@@ -7982,6 +8007,9 @@
 typedef void  (*WDI_GetFrameLogRspCb)(
                         WDI_GetFrameLogRspParamType *wdiRsp, void *pUserData);
 
+typedef void  (*WDI_MonStartRspCb)(void *pEventData,void *pUserData);
+typedef void  (*WDI_MonStopRspCb)(void *pUserData);
+
 /*========================================================================
  *     Function Declarations and Documentation
  ==========================================================================*/
@@ -11332,6 +11360,19 @@
    wpt_uint32                   pUserData
 );
 
+WDI_Status WDI_MonStartReq
+(
+    WDI_MonStartReqType*   pwdiMonStartReqParams,
+    WDI_MonStartRspCb      wdiMonStartRspCb,
+    void*                  pUserData
+);
+
+WDI_Status WDI_MonStopReq
+(
+    WDI_MonStopRspCb      wdiMonStopRspCb,
+    void*                  pUserData
+);
+
 #ifdef FEATURE_WLAN_BATCH_SCAN
 /**
  @brief WDI_SetBatchScanReq
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
index a1970f4..a8d78f5 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
@@ -476,6 +476,9 @@
   /* NAN Request */
   WDI_NAN_REQUEST                                = 106,
 
+  WDI_MON_START_REQ                              = 107,
+  WDI_MON_STOP_REQ                               = 108,
+
   WDI_MAX_REQ,
 
   /*Send a suspend Indication down to HAL*/
@@ -812,6 +815,9 @@
 
   WDI_NAN_RESPONSE                               = 106,
 
+  WDI_MON_START_RSP                              = 107,
+  WDI_MON_STOP_RSP                               = 108,
+
   /*-------------------------------------------------------------------------
     Indications
      !! Keep these last in the enum if possible
@@ -6226,6 +6232,33 @@
   WDI_EventInfoType*     pEventData
 );
 
+WDI_Status
+WDI_ProcessMonStartReq
+(
+   WDI_ControlBlockType*  pWDICtx,
+   WDI_EventInfoType*     pEventData
+);
+
+WDI_Status
+WDI_ProcessMonStartRsp
+(
+   WDI_ControlBlockType*  pWDICtx,
+   WDI_EventInfoType*     pEventData
+);
+
+WDI_Status
+WDI_ProcessMonStopReq
+(
+   WDI_ControlBlockType*  pWDICtx,
+   WDI_EventInfoType*     pEventData
+);
+
+WDI_Status
+WDI_ProcessMonStopRsp
+(
+   WDI_ControlBlockType*  pWDICtx,
+   WDI_EventInfoType*     pEventData
+);
 
 #endif /*WLAN_QCT_WDI_I_H*/
 
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index 404c69c..a64a63e 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -476,6 +476,8 @@
 
   WDI_ProcessNanRequest,            /* WDI_NAN_REQUEST*/
 
+  WDI_ProcessMonStartReq,          /* WDI_MON_START_REQ */
+  WDI_ProcessMonStopReq,           /* WDI_MON_STOP_REQ */
   /*-------------------------------------------------------------------------
     Indications
   -------------------------------------------------------------------------*/
@@ -745,6 +747,8 @@
 
     WDI_ProcessNanResponse,                    /* WDI_NAN_RESPONSE */
 
+    WDI_ProcessMonStartRsp,                    /* WDI_MON_START_RSP*/
+    WDI_ProcessMonStopRsp,                    /* WDI_MON_STOP_RSP*/
   /*---------------------------------------------------------------------
     Indications
   ---------------------------------------------------------------------*/
@@ -1170,6 +1174,8 @@
     CASE_RETURN_STRING( WDI_GET_FRAME_LOG_REQ);
     CASE_RETURN_STRING( WDI_NAN_REQUEST );
     CASE_RETURN_STRING( WDI_SET_RTS_CTS_HTVHT_IND );
+    CASE_RETURN_STRING( WDI_MON_START_REQ );
+    CASE_RETURN_STRING( WDI_MON_STOP_REQ );
     default:
         return "Unknown WDI MessageId";
   }
@@ -24136,7 +24142,10 @@
        return WLAN_HAL_NAN_REQ;
   case WDI_SET_RTS_CTS_HTVHT_IND:
        return WLAN_HAL_SET_RTS_CTS_HTVHT_IND;
-
+  case WDI_MON_START_REQ:
+       return WLAN_HAL_ENABLE_MONITOR_MODE_REQ;
+  case WDI_MON_STOP_REQ:
+       return WLAN_HAL_DISABLE_MONITOR_MODE_REQ;
   default:
     return WLAN_HAL_MSG_MAX;
   }
@@ -24462,7 +24471,10 @@
        return WDI_NAN_RESPONSE;
   case WLAN_HAL_NAN_EVT:
        return WDI_HAL_NAN_EVENT;
-
+  case WLAN_HAL_ENABLE_MONITOR_MODE_RSP:
+       return WDI_MON_START_RSP;
+  case WLAN_HAL_DISABLE_MONITOR_MODE_RSP:
+       return WDI_MON_STOP_RSP;
   default:
     return eDRIVER_TYPE_MAX;
   }
@@ -29512,6 +29524,75 @@
     return featSupported;
 }
 
+wpt_uint8 WDI_selectCbMode( wpt_uint8 channel, wpt_uint8 ChannelBW )
+{
+  /* 5gHz Channel */
+  if( channel >= 34 && channel <= 165 )
+  {
+    if( ChannelBW == 80 && WDI_getFwWlanFeatCaps(DOT11AC) )
+    {
+      if ( channel== 36 || channel == 52 || channel == 100 ||
+            channel == 116 || channel == 149 )
+      {
+            return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
+      }
+      else if ( channel == 40 || channel == 56 || channel == 104 ||
+            channel == 120 || channel == 153 )
+      {
+         return  PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
+      }
+      else if ( channel == 44 || channel == 60 || channel == 108 ||
+            channel == 124 || channel == 157 )
+      {
+         return PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
+      }
+      else if ( channel == 48 || channel == 64 || channel == 112 ||
+            channel == 128 || channel == 144 || channel == 161 )
+      {
+         return PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
+      }
+      else if ( channel == 165 )
+      {
+         return PHY_SINGLE_CHANNEL_CENTERED;
+      }
+     }
+
+    else
+    {
+      if ( channel== 40 || channel == 48 || channel == 56 ||
+            channel == 64 || channel == 104 || channel == 112 ||
+            channel == 120 || channel == 128 || channel == 136 ||
+            channel == 144 || channel == 153 || channel == 161 )
+      {
+         return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
+      }
+      else if ( channel== 36 || channel == 44 || channel == 52 ||
+            channel == 60 || channel == 100 || channel == 108 ||
+            channel == 116 || channel == 124 || channel == 132 ||
+            channel == 140 || channel == 149 || channel == 157 )
+      {
+         return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
+      }
+      else if ( channel == 165 )
+      {
+         return PHY_SINGLE_CHANNEL_CENTERED;
+      }
+    }
+   }
+
+   /* 2.4Ghz Channel */
+   if( ChannelBW == 40 && WDI_getFwWlanFeatCaps(HT40_OBSS_SCAN) )
+   {
+      if (channel >= 1 && channel <= 7)
+         return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
+      else if (channel >= 8 && channel <= 13)
+         return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
+      else if (channel ==14)
+         return PHY_SINGLE_CHANNEL_CENTERED;
+   }
+  return PHY_SINGLE_CHANNEL_CENTERED;
+}
+
 #ifdef WLAN_FEATURE_11AC
 WDI_Status
 WDI_ProcessUpdateVHTOpModeReq
@@ -31949,6 +32030,248 @@
 
 }
 
+WDI_Status
+WDI_MonStartReq(WDI_MonStartReqType* pwdiMonStartReqParams,
+                           WDI_MonStartRspCb   wdiMonStartRspCb,
+                           void*                   pUserData)
+{
+   WDI_EventInfoType      wdiEventData;
+
+  WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
+         "%s", __func__);
+
+  if ( eWLAN_PAL_FALSE == gWDIInitialized )
+  {
+     VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_ERROR,
+                "WDI API call before module is initialized - Fail request");
+
+     return WDI_STATUS_E_NOT_ALLOWED;
+  }
+
+  wdiEventData.wdiRequest      = WDI_MON_START_REQ;
+  wdiEventData.pEventData      = pwdiMonStartReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiMonStartReqParams);
+  wdiEventData.pCBfnc          = wdiMonStartRspCb;
+  wdiEventData.pUserData       = pUserData;
+
+  return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}
+
+WDI_Status
+WDI_ProcessMonStartReq
+(
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_EventInfoType*     pEventData
+)
+{
+  WDI_MonStartReqType* pwdiMonStartReqParams;
+  WDI_MonStartRspCb wdiMonStartCb;
+  wpt_uint8*               pSendBuffer         = NULL;
+  wpt_uint16               usSendSize          = 0;
+  wpt_uint16               usDataOffset        = 0;
+  tHalEnableMonitorModeReqParams  halEnableMonitorModeParams;
+
+  WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
+         "%s", __func__);
+
+  if (( NULL == pEventData ) || ( NULL == pEventData->pEventData ) ||
+      ( NULL == pEventData->pCBfnc ))
+  {
+     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+                 "%s: Invalid parameters", __func__);
+     WDI_ASSERT(0);
+     return WDI_STATUS_E_FAILURE;
+  }
+
+  pwdiMonStartReqParams = (WDI_MonStartReqType*)pEventData->pEventData;
+  wdiMonStartCb   = (WDI_MonStartRspCb)pEventData->pCBfnc;
+
+  /*-----------------------------------------------------------------------
+    Get message buffer
+    ! TO DO : proper conversion into the HAL Message Request Format
+  -----------------------------------------------------------------------*/
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer(
+                                        pWDICtx,
+                                        WDI_MON_START_REQ,
+                                        sizeof(tHalEnableMonitorModeReqParams),
+                                        &pSendBuffer, &usDataOffset,
+                                        &usSendSize))||
+      ( usSendSize < (usDataOffset + sizeof(halEnableMonitorModeParams) )))
+  {
+     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
+              "Unable to get send buffer in %s %p %p %p", __func__,
+                pEventData, pwdiMonStartReqParams, wdiMonStartCb);
+     WDI_ASSERT(0);
+     return WDI_STATUS_E_FAILURE;
+  }
+
+ halEnableMonitorModeParams.channelNumber = pwdiMonStartReqParams->ChannelNo;
+ halEnableMonitorModeParams.cbState = WDI_selectCbMode(pwdiMonStartReqParams->ChannelNo,
+                                                       pwdiMonStartReqParams->ChannelBW);
+ halEnableMonitorModeParams.maxAmpduLen = 0x1FFFF;
+ halEnableMonitorModeParams.maxMpduInAmpduLen = 0xF20-0x4C;
+ halEnableMonitorModeParams.crcCheckEnabled = pwdiMonStartReqParams->crcCheckEnabled;
+ halEnableMonitorModeParams.numMacFilters = pwdiMonStartReqParams->numOfMacFilters;
+ wpalMemoryCopy(halEnableMonitorModeParams.macFilters[0].macAddr,
+                pwdiMonStartReqParams->mmFilters[0].macAddr,
+                sizeof( wpt_macAddr ));
+ halEnableMonitorModeParams.macFilters[0].isA1filteringNeeded = pwdiMonStartReqParams->mmFilters[0].isA1filter;
+ halEnableMonitorModeParams.macFilters[0].isA2filteringNeeded = pwdiMonStartReqParams->mmFilters[0].isA2filter;
+ halEnableMonitorModeParams.macFilters[0].isA3filteringNeeded = pwdiMonStartReqParams->mmFilters[0].isA3filter;
+ halEnableMonitorModeParams.typeSubtypeBitmap = pwdiMonStartReqParams->typeSubtypeBitmap;
+
+ wpalMemoryCopy(pSendBuffer+usDataOffset,
+                  &halEnableMonitorModeParams,
+                  sizeof(halEnableMonitorModeParams));
+
+ pWDICtx->pReqStatusUserData = pEventData->pUserData;
+
+ return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                      wdiMonStartCb, pEventData->pUserData,
+                      WDI_MON_START_RSP);
+}
+
+WDI_Status
+WDI_ProcessMonStartRsp
+(
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_EventInfoType*     pEventData
+)
+{
+  WDI_MonStartRspCb   wdiMonStartRspCb;
+
+  WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+              "%s: Enter ", __func__);
+  /*-------------------------------------------------------------------------
+    Sanity check
+  -------------------------------------------------------------------------*/
+  if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
+      ( NULL == pEventData->pEventData))
+  {
+     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+                 "%s: Invalid parameters", __func__);
+     WDI_ASSERT(0);
+     return WDI_STATUS_E_FAILURE;
+  }
+
+  wdiMonStartRspCb = (WDI_MonStartRspCb)pWDICtx->pfncRspCB;
+
+  wdiMonStartRspCb((void *) pEventData->pEventData, pWDICtx->pRspCBUserData);
+
+  return WDI_STATUS_SUCCESS;
+}
+
+WDI_Status
+WDI_MonStopReq(WDI_MonStopRspCb wdiMonStopRspCb,
+               void*                 pUserData)
+{
+   WDI_EventInfoType      wdiEventData;
+
+  WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
+         "%s", __func__);
+
+  if ( eWLAN_PAL_FALSE == gWDIInitialized )
+  {
+     VOS_TRACE( VOS_MODULE_ID_WDI, VOS_TRACE_LEVEL_ERROR,
+                "WDI API call before module is initialized - Fail request");
+
+     return WDI_STATUS_E_NOT_ALLOWED;
+  }
+
+  wdiEventData.wdiRequest      = WDI_MON_STOP_REQ;
+  wdiEventData.pEventData      = NULL;
+  wdiEventData.uEventDataSize  = sizeof(NULL);
+  wdiEventData.pCBfnc          = wdiMonStopRspCb;
+  wdiEventData.pUserData       = pUserData;
+
+  return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+}
+
+WDI_Status
+WDI_ProcessMonStopReq
+(
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_EventInfoType*     pEventData
+)
+{
+  WDI_MonStopRspCb         wdiMonStopCb;
+  wpt_uint8*               pSendBuffer         = NULL;
+  wpt_uint16               usSendSize          = 0;
+  wpt_uint16               usDataOffset        = 0;
+  wpt_uint8                resetConfiguration;
+
+  WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_INFO,
+         "%s", __func__);
+
+  if (( NULL == pEventData ) || ( NULL == pEventData->pCBfnc ))
+  {
+     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+                 "%s: Invalid parameters", __func__);
+     WDI_ASSERT(0);
+     return WDI_STATUS_E_FAILURE;
+  }
+
+  wdiMonStopCb   = (WDI_MonStopRspCb)pEventData->pCBfnc;
+
+  /*-----------------------------------------------------------------------
+    Get message buffer
+    ! TO DO : proper conversion into the HAL Message Request Format
+  -----------------------------------------------------------------------*/
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer(
+                                        pWDICtx,
+                                        WDI_MON_STOP_REQ,
+                                        sizeof(wpt_uint8),
+                                        &pSendBuffer, &usDataOffset,
+                                        &usSendSize))||
+      ( usSendSize < (usDataOffset + sizeof(wpt_uint8) )))
+  {
+     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
+              "Unable to get send buffer in %s %p %p", __func__,
+                pEventData, wdiMonStopCb);
+     WDI_ASSERT(0);
+     return WDI_STATUS_E_FAILURE;
+  }
+
+ wpalMemoryCopy(pSendBuffer+usDataOffset,
+                  &resetConfiguration,
+                  sizeof(wpt_uint8));
+
+ pWDICtx->pReqStatusUserData = pEventData->pUserData;
+
+ return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                      wdiMonStopCb, pEventData->pUserData,
+                      WDI_MON_STOP_RSP);
+}
+
+WDI_Status
+WDI_ProcessMonStopRsp
+(
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_EventInfoType*     pEventData
+)
+{
+  WDI_MonStopRspCb   wdiMonStopRspCb;
+
+  WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+              "%s: Enter ", __func__);
+  /*-------------------------------------------------------------------------
+    Sanity check
+  -------------------------------------------------------------------------*/
+  if (( NULL == pWDICtx ) || ( NULL == pEventData ))
+  {
+     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+                 "%s: Invalid parameters", __func__);
+     WDI_ASSERT(0);
+     return WDI_STATUS_E_FAILURE;
+  }
+
+  wdiMonStopRspCb = (WDI_MonStopRspCb)pWDICtx->pfncRspCB;
+
+  wdiMonStopRspCb(pWDICtx->pRspCBUserData);
+
+  return WDI_STATUS_SUCCESS;
+}
+
 #ifdef WLAN_FEATURE_EXTSCAN
 
 /**
diff --git a/riva/inc/wlan_hal_msg.h b/riva/inc/wlan_hal_msg.h
index 9cd6157..6dea310 100644
--- a/riva/inc/wlan_hal_msg.h
+++ b/riva/inc/wlan_hal_msg.h
@@ -534,6 +534,7 @@
 
    WLAN_HAL_DISABLE_MONITOR_MODE_REQ        = 304,
    WLAN_HAL_DISABLE_MONITOR_MODE_RSP        = 305,
+
    WLAN_HAL_SET_RTS_CTS_HTVHT_IND           = 306,
 
    WLAN_HAL_MSG_MAX = WLAN_HAL_MSG_TYPE_MAX_ENUM_SIZE
@@ -8525,6 +8526,89 @@
     tMgmtLoggingInitResp  tMgmtLoggingInitRespParams;
 }  tMgmtLoggingInitRespMsg,  * tpMgmtLoggingInitRespMsg;
 
+/*---------------------------------------------------------------------------
+* WLAN_HAL_ENABLE_MONITOR_MODE_REQ
+*-------------------------------------------------------------------------*/
+
+/* only 1 filter is supported as of now */
+#define NUM_FILTERS_SUPPORTED 1
+
+typedef PACKED_PRE struct PACKED_POST
+{
+   tSirMacAddr macAddr;
+   tANI_U8 isA1filteringNeeded;
+   tANI_U8 isA2filteringNeeded;
+   tANI_U8 isA3filteringNeeded;
+}tHalMacFilter, *tpHalMacFilter;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+   tANI_U8 channelNumber;
+   ePhyChanBondState cbState;
+
+   tANI_U32 maxAmpduLen;
+   tANI_U32 maxMpduInAmpduLen;
+
+   tANI_U8 crcCheckEnabled;
+
+   /* value is "1" for this FR. "0" means no filter, RECEIVE ALL PACKETS */
+   tANI_U8 numMacFilters;
+   tHalMacFilter macFilters[NUM_FILTERS_SUPPORTED];
+
+   /* Each bit position maps to IEEE convention of typeSubtype */
+   tANI_U64 typeSubtypeBitmap;
+
+   tANI_U64 reserved;
+
+}tHalEnableMonitorModeReqParams, *tpHalEnableMonitorModeReqParams;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+   tHalMsgHeader header;
+   tHalEnableMonitorModeReqParams enableMonitorModeReqParams;
+}tHalEnableMonitorModeReqMsg, *tpHalEnableMonitorModeReqMsg;
+
+
+/*---------------------------------------------------------------------------
+* WLAN_HAL_ENABLE_MONITOR_MODE_RSP
+*-------------------------------------------------------------------------*/
+
+typedef PACKED_PRE struct PACKED_POST
+{
+   tANI_U32 status;
+}tHalEnableMonitorModeRspParams, *tpHalEnableMonitorModeRspParams;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+   tHalMsgHeader header;
+   tHalEnableMonitorModeRspParams enableMonitorModeRspParams;
+}tHalEnableMonitorModeRspMsg, *tpHalEnableMonitorModeRspMsg;
+
+/*---------------------------------------------------------------------------
+* WLAN_HAL_DISABLE_MONITOR_MODE_REQ
+*-------------------------------------------------------------------------*/
+
+typedef PACKED_PRE struct PACKED_POST
+{
+   tHalMsgHeader header;
+   tANI_U8 resetConfiguration;
+}tHalDisableMonitorModeReqMsg, *tpHalDisableMonitorModeReqMsg;
+
+/*---------------------------------------------------------------------------
+* WLAN_HAL_DISABLE_MONITOR_MODE_RSP
+*-------------------------------------------------------------------------*/
+
+typedef PACKED_PRE struct PACKED_POST
+{
+   tANI_U32 status;
+}tHalDisableMonitorModeRspParams, *tpHalDisableMonitorModeRspParams;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+   tHalMsgHeader header;
+   tHalDisableMonitorModeRspParams disableMonitorModeRspParams;
+}tHalDisableMonitorModeRspMsg, *tpHalDisableMonitorModeRspMsg;
+
 #if defined(__ANI_COMPILER_PRAGMA_PACK_STACK)
 #pragma pack(pop)
 #elif defined(__ANI_COMPILER_PRAGMA_PACK)