summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManikandan Mohan <manikand@qti.qualcomm.com>2013-12-12 02:41:48 -0800
committerPrakash Dhavali <pdhavali@qca.qualcomm.com>2014-01-11 15:17:10 -0800
commitb63d991fd861386900a2461583c029a4a35a206c (patch)
tree619800993ceab34841f8093afe34d0fa4b56da91
parentf5cb66c579ed5c64689816f236a882e2dadff9b5 (diff)
qcacld: ipa: IPA interface module for CLD Driver
Current design uses passing all the data packets to Linux network stack for routing the packets across interfaces. By doing this host CPU is always busy in handling packet routing. With the concept of IP Accelerator (IPA) interface, the IP packets are sent to IPA for routing instead of sending to Linux Network stack. Change-Id: Ia464467eb75978dcc2a637428014a42c7af57e51 CRs-fixed: 595907
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.c21
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h259
-rw-r--r--CORE/HDD/inc/wlan_hdd_ipa.h56
-rw-r--r--CORE/HDD/inc/wlan_hdd_main.h123
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c38
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c43
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c757
-rw-r--r--CORE/HDD/src/wlan_hdd_ipa.c1559
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c10
-rw-r--r--CORE/HDD/src/wlan_hdd_softap_tx_rx.c22
-rw-r--r--CORE/HDD/src/wlan_hdd_tx_rx.c12
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.c5
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.h3
-rw-r--r--CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h9
-rw-r--r--Makefile19
-rw-r--r--firmware_bin/WCNSS_qcom_cfg.ini6
16 files changed, 2405 insertions, 537 deletions
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
index 74b592d86dba..8c38ccb15850 100644
--- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c
+++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
@@ -629,7 +629,10 @@ static void tlshim_data_rx_handler(void *context, u_int16_t staid,
/* Flush the cached frames to HDD before passing new rx frame */
tl_shim_flush_rx_frames(vos_ctx, tl_shim, staid, 0);
-
+#ifdef IPA_OFFLOAD
+ ret = sta_info->data_rx(vos_ctx, rx_buf_list, staid);
+ if (ret == VOS_STATUS_E_INVAL) {
+#endif
buf = rx_buf_list;
while (buf) {
next_buf = adf_nbuf_queue_next(buf);
@@ -656,6 +659,9 @@ static void tlshim_data_rx_handler(void *context, u_int16_t staid,
adf_nbuf_free(buf);
buf = next_buf;
}
+#ifdef IPA_OFFLOAD
+ }
+#endif
} else /* This should not happen if sta_info->registered is true */
goto drop_rx_buf;
@@ -757,8 +763,19 @@ adf_nbuf_t WLANTL_SendSTA_DataFrame(void *vos_ctx, u_int8_t sta_id,
}
/* Zero out skb's context buffer for the driver to use */
+#ifdef IPA_OFFLOAD
+ if ((NBUF_OWNER_ID(skb) == IPA_NBUF_OWNER_ID)
+ && NBUF_CALLBACK_FN(skb)) {
+ uint32_t skb_owner_id = NBUF_OWNER_ID(skb);
+ __adf_nbuf_callback_fn skb_cb_fn = NBUF_CALLBACK_FN(skb);
+ adf_os_mem_set(skb->cb, 0, sizeof(skb->cb));
+ NBUF_OWNER_ID(skb) = skb_owner_id;
+ NBUF_CALLBACK_FN(skb) = skb_cb_fn;
+ } else
+ adf_os_mem_set(skb->cb, 0, sizeof(skb->cb));
+#else
adf_os_mem_set(skb->cb, 0, sizeof(skb->cb));
-
+#endif
adf_nbuf_map_single(adf_ctx, skb, ADF_OS_DMA_TO_DEVICE);
if ((tl_shim->ip_checksum_offload) && (skb->protocol == htons(ETH_P_IP))
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 624149ddaa88..c2bdb8a8f3a9 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -37,9 +37,9 @@
/* $HEADER$ */
-/*---------------------------------------------------------------------------
+/*---------------------------------------------------------------------------
Include files
- -------------------------------------------------------------------------*/
+ -------------------------------------------------------------------------*/
#include <wlan_hdd_includes.h>
#include <wlan_hdd_wmm.h>
#include <vos_types.h>
@@ -60,21 +60,21 @@
#define CFG_RTS_THRESHOLD_DEFAULT WNI_CFG_RTS_THRESHOLD_STADEF
#define CFG_FRAG_THRESHOLD_NAME "gFragmentationThreshold"
-#define CFG_FRAG_THRESHOLD_MIN WNI_CFG_FRAGMENTATION_THRESHOLD_STAMIN
+#define CFG_FRAG_THRESHOLD_MIN WNI_CFG_FRAGMENTATION_THRESHOLD_STAMIN
#define CFG_FRAG_THRESHOLD_MAX WNI_CFG_FRAGMENTATION_THRESHOLD_STAMAX
#define CFG_FRAG_THRESHOLD_DEFAULT WNI_CFG_FRAGMENTATION_THRESHOLD_STADEF
#define CFG_CALIBRATION_NAME "gCalibration"
-#define CFG_CALIBRATION_MIN ( 0 )
+#define CFG_CALIBRATION_MIN ( 0 )
#define CFG_CALIBRATION_MAX ( 1 )
#define CFG_CALIBRATION_MAC_DEFAULT ( 1 )
#define CFG_CALIBRATION_DEFAULT CFG_CALIBRATION_MAC_DEFAULT
#define CFG_CALIBRATION_PERIOD_NAME "gCalibrationPeriod"
-#define CFG_CALIBRATION_PERIOD_MIN ( 2 )
+#define CFG_CALIBRATION_PERIOD_MIN ( 2 )
#define CFG_CALIBRATION_PERIOD_MAX ( 10 )
#define CFG_CALIBRATION_PERIOD_MAC_DEFAULT ( 5 )
-#define CFG_CALIBRATION_PERIOD_DEFAULT CFG_CALIBRATION_PERIOD_MAC_DEFAULT
+#define CFG_CALIBRATION_PERIOD_DEFAULT CFG_CALIBRATION_PERIOD_MAC_DEFAULT
#define CFG_OPERATING_CHANNEL_NAME "gOperatingChannel"
#define CFG_OPERATING_CHANNEL_MIN ( 0 )
@@ -87,21 +87,21 @@
#define CFG_SHORT_SLOT_TIME_ENABLED_DEFAULT WNI_CFG_SHORT_SLOT_TIME_STADEF
#define CFG_11D_SUPPORT_ENABLED_NAME "g11dSupportEnabled"
-#define CFG_11D_SUPPORT_ENABLED_MIN WNI_CFG_11D_ENABLED_STAMIN
-#define CFG_11D_SUPPORT_ENABLED_MAX WNI_CFG_11D_ENABLED_STAMAX
-#define CFG_11D_SUPPORT_ENABLED_DEFAULT WNI_CFG_11D_ENABLED_STADEF // Default is ON
+#define CFG_11D_SUPPORT_ENABLED_MIN WNI_CFG_11D_ENABLED_STAMIN
+#define CFG_11D_SUPPORT_ENABLED_MAX WNI_CFG_11D_ENABLED_STAMAX
+#define CFG_11D_SUPPORT_ENABLED_DEFAULT WNI_CFG_11D_ENABLED_STADEF // Default is ON
#define CFG_11H_SUPPORT_ENABLED_NAME "g11hSupportEnabled"
#define CFG_11H_SUPPORT_ENABLED_MIN ( 0 )
#define CFG_11H_SUPPORT_ENABLED_MAX ( 1 )
-#define CFG_11H_SUPPORT_ENABLED_DEFAULT ( 1 ) // Default is ON
+#define CFG_11H_SUPPORT_ENABLED_DEFAULT ( 1 ) // Default is ON
#define CFG_ENFORCE_11D_CHANNELS_NAME "gEnforce11dChannel"
#define CFG_ENFORCE_11D_CHANNELS_MIN ( 0 )
#define CFG_ENFORCE_11D_CHANNELS_MAX ( 1 )
#define CFG_ENFORCE_11D_CHANNELS_DEFAULT ( 0 )
-//COUNTRY Code Priority
+//COUNTRY Code Priority
#define CFG_COUNTRY_CODE_PRIORITY_NAME "gCountryCodePriority"
#define CFG_COUNTRY_CODE_PRIORITY_MIN ( 0 )
#define CFG_COUNTRY_CODE_PRIORITY_MAX ( 1 )
@@ -114,7 +114,7 @@
#define CFG_ENFORCE_DEFAULT_DOMAIN_NAME "gEnforceDefaultDomain"
#define CFG_ENFORCE_DEFAULT_DOMAIN_MIN ( 0 )
-#define CFG_ENFORCE_DEFAULT_DOMAIN_MAX ( 1 )
+#define CFG_ENFORCE_DEFAULT_DOMAIN_MAX ( 1 )
#define CFG_ENFORCE_DEFAULT_DOMAIN_DEFAULT ( 0 )
#define CFG_GENERIC_ID1_NAME "gCfg1Id"
@@ -198,11 +198,11 @@
#define CFG_ENABLE_IMPS_MAX ( 1 )
#define CFG_ENABLE_IMPS_DEFAULT ( 1 )
-#define CFG_IMPS_MINIMUM_SLEEP_TIME_NAME "gImpsMinSleepTime"
+#define CFG_IMPS_MINIMUM_SLEEP_TIME_NAME "gImpsMinSleepTime"
#define CFG_IMPS_MINIMUM_SLEEP_TIME_MIN ( 0 )
#define CFG_IMPS_MINIMUM_SLEEP_TIME_MAX ( 65535 )
#define CFG_IMPS_MINIMUM_SLEEP_TIME_DEFAULT ( 5 )
-
+
#define CFG_IMPS_MODERATE_SLEEP_TIME_NAME "gImpsModSleepTime"
#define CFG_IMPS_MODERATE_SLEEP_TIME_MIN ( 0 )
#define CFG_IMPS_MODERATE_SLEEP_TIME_MAX ( 65535 )
@@ -223,7 +223,7 @@
#define CFG_BMPS_MINIMUM_LI_MIN ( 1 )
#define CFG_BMPS_MINIMUM_LI_MAX ( 65535 )
#define CFG_BMPS_MINIMUM_LI_DEFAULT ( 1 )
-
+
#define CFG_BMPS_MODERATE_LI_NAME "gBmpsModListenInterval"
#define CFG_BMPS_MODERATE_LI_MIN ( 1 )
#define CFG_BMPS_MODERATE_LI_MAX ( 65535 )
@@ -237,9 +237,9 @@
// gEnableAutoBmpsTimer has been previously published as an externally
// configurable parameter. See analysis of CR 178211 for detailed info
// on why we want to *always* set this to 1 i.e. we no longer want
-// this parameter to be configurable. the clean solution would be for
-// users to not define this item in winreg so that the default value
-// (which needs to be changed to 1) gets picked up but we cannot rely on that
+// this parameter to be configurable. the clean solution would be for
+// users to not define this item in winreg so that the default value
+// (which needs to be changed to 1) gets picked up but we cannot rely on that
// since this item has been published already hence the proposed
// solution to change the name of the item along with the change in the
// default value. also we could decide to not read this item from registry
@@ -250,15 +250,15 @@
#define CFG_ENABLE_AUTO_BMPS_TIMER_MAX ( 1 )
#define CFG_ENABLE_AUTO_BMPS_TIMER_DEFAULT ( 1 )
-#define CFG_AUTO_BMPS_TIMER_VALUE_NAME "gAutoBmpsTimerValue"
+#define CFG_AUTO_BMPS_TIMER_VALUE_NAME "gAutoBmpsTimerValue"
#define CFG_AUTO_BMPS_TIMER_VALUE_MIN ( 1000 )
#define CFG_AUTO_BMPS_TIMER_VALUE_MAX ( 4294967295UL )
-#define CFG_AUTO_BMPS_TIMER_VALUE_DEFAULT ( 1000 )
-
-#define CFG_MAX_RX_AMPDU_FACTOR_NAME "gMaxRxAmpduFactor"
-#define CFG_MAX_RX_AMPDU_FACTOR_MIN WNI_CFG_MAX_RX_AMPDU_FACTOR_STAMIN
-#define CFG_MAX_RX_AMPDU_FACTOR_MAX WNI_CFG_MAX_RX_AMPDU_FACTOR_STAMAX
-#define CFG_MAX_RX_AMPDU_FACTOR_DEFAULT WNI_CFG_MAX_RX_AMPDU_FACTOR_STADEF
+#define CFG_AUTO_BMPS_TIMER_VALUE_DEFAULT ( 1000 )
+
+#define CFG_MAX_RX_AMPDU_FACTOR_NAME "gMaxRxAmpduFactor"
+#define CFG_MAX_RX_AMPDU_FACTOR_MIN WNI_CFG_MAX_RX_AMPDU_FACTOR_STAMIN
+#define CFG_MAX_RX_AMPDU_FACTOR_MAX WNI_CFG_MAX_RX_AMPDU_FACTOR_STAMAX
+#define CFG_MAX_RX_AMPDU_FACTOR_DEFAULT WNI_CFG_MAX_RX_AMPDU_FACTOR_STADEF
//Configuration added to enable/disable CTS2SELF in
//Adaptive RX drain feature
@@ -295,24 +295,24 @@ typedef enum
#endif
#define CFG_CHANNEL_BONDING_MODE_24GHZ_NAME "gChannelBondingMode24GHz"
-#define CFG_CHANNEL_BONDING_MODE_MIN WNI_CFG_CHANNEL_BONDING_MODE_STAMIN
-#define CFG_CHANNEL_BONDING_MODE_MAX WNI_CFG_CHANNEL_BONDING_MODE_STAMAX
-#define CFG_CHANNEL_BONDING_MODE_DEFAULT WNI_CFG_CHANNEL_BONDING_MODE_STADEF
+#define CFG_CHANNEL_BONDING_MODE_MIN WNI_CFG_CHANNEL_BONDING_MODE_STAMIN
+#define CFG_CHANNEL_BONDING_MODE_MAX WNI_CFG_CHANNEL_BONDING_MODE_STAMAX
+#define CFG_CHANNEL_BONDING_MODE_DEFAULT WNI_CFG_CHANNEL_BONDING_MODE_STADEF
#define CFG_CHANNEL_BONDING_MODE_5GHZ_NAME "gChannelBondingMode5GHz"
-#define CFG_CHANNEL_BONDING_MODE_MIN WNI_CFG_CHANNEL_BONDING_MODE_STAMIN
-#define CFG_CHANNEL_BONDING_MODE_MAX WNI_CFG_CHANNEL_BONDING_MODE_STAMAX
-#define CFG_CHANNEL_BONDING_MODE_DEFAULT WNI_CFG_CHANNEL_BONDING_MODE_STADEF
+#define CFG_CHANNEL_BONDING_MODE_MIN WNI_CFG_CHANNEL_BONDING_MODE_STAMIN
+#define CFG_CHANNEL_BONDING_MODE_MAX WNI_CFG_CHANNEL_BONDING_MODE_STAMAX
+#define CFG_CHANNEL_BONDING_MODE_DEFAULT WNI_CFG_CHANNEL_BONDING_MODE_STADEF
#define CFG_FIXED_RATE_NAME "gFixedRate"
#define CFG_FIXED_RATE_MIN WNI_CFG_FIXED_RATE_STAMIN
#define CFG_FIXED_RATE_MAX WNI_CFG_FIXED_RATE_STAMAX
-#define CFG_FIXED_RATE_DEFAULT WNI_CFG_FIXED_RATE_STADEF
-
+#define CFG_FIXED_RATE_DEFAULT WNI_CFG_FIXED_RATE_STADEF
+
#define CFG_SHORT_GI_20MHZ_NAME "gShortGI20Mhz"
#define CFG_SHORT_GI_20MHZ_MIN WNI_CFG_SHORT_GI_20MHZ_STAMIN
-#define CFG_SHORT_GI_20MHZ_MAX WNI_CFG_SHORT_GI_20MHZ_STAMAX
-#define CFG_SHORT_GI_20MHZ_DEFAULT WNI_CFG_SHORT_GI_20MHZ_STADEF
+#define CFG_SHORT_GI_20MHZ_MAX WNI_CFG_SHORT_GI_20MHZ_STAMAX
+#define CFG_SHORT_GI_20MHZ_DEFAULT WNI_CFG_SHORT_GI_20MHZ_STADEF
#define CFG_BLOCK_ACK_AUTO_SETUP_NAME "gBlockAckAutoSetup"
#define CFG_BLOCK_ACK_AUTO_SETUP_MIN ( 0 )
@@ -347,14 +347,14 @@ typedef enum
#define CFG_SCAN_RESULT_AGE_TIME_CPS_DEFAULT ( 600 )
#define CFG_RSSI_CATEGORY_GAP_NAME "gRssiCatGap"
-#define CFG_RSSI_CATEGORY_GAP_MIN ( 5 )
-#define CFG_RSSI_CATEGORY_GAP_MAX ( 100 )
+#define CFG_RSSI_CATEGORY_GAP_MIN ( 5 )
+#define CFG_RSSI_CATEGORY_GAP_MAX ( 100 )
#define CFG_RSSI_CATEGORY_GAP_DEFAULT ( 5 )
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
#define CFG_ROAM_PREFER_5GHZ "gRoamPrefer5GHz"
-#define CFG_ROAM_PREFER_5GHZ_MIN ( 0 )
-#define CFG_ROAM_PREFER_5GHZ_MAX ( 1 )
+#define CFG_ROAM_PREFER_5GHZ_MIN ( 0 )
+#define CFG_ROAM_PREFER_5GHZ_MAX ( 1 )
#define CFG_ROAM_PREFER_5GHZ_DEFAULT ( 1 )
/*
@@ -404,8 +404,8 @@ typedef enum
#define CFG_AP_QOS_UAPSD_MODE_NAME "gEnableApUapsd" // ACs to setup U-APSD for at assoc
#define CFG_AP_QOS_UAPSD_MODE_MIN ( 0 )
-#define CFG_AP_QOS_UAPSD_MODE_MAX ( 1 )
-#define CFG_AP_QOS_UAPSD_MODE_DEFAULT ( 1 )
+#define CFG_AP_QOS_UAPSD_MODE_MAX ( 1 )
+#define CFG_AP_QOS_UAPSD_MODE_DEFAULT ( 1 )
#define CFG_AP_COUNTRY_CODE "gAPCntryCode"
#define CFG_AP_COUNTRY_CODE_MIN "USI"
@@ -435,20 +435,20 @@ typedef enum
#define CFG_AP_PROTECTION_MODE_MAX ( 0xFFFF )
#define CFG_AP_PROTECTION_MODE_DEFAULT ( 0xBFFF )
-#define CFG_AP_OBSS_PROTECTION_MODE_NAME "gEnableApOBSSProt"
+#define CFG_AP_OBSS_PROTECTION_MODE_NAME "gEnableApOBSSProt"
#define CFG_AP_OBSS_PROTECTION_MODE_MIN ( 0 )
-#define CFG_AP_OBSS_PROTECTION_MODE_MAX ( 1 )
-#define CFG_AP_OBSS_PROTECTION_MODE_DEFAULT ( 0 )
+#define CFG_AP_OBSS_PROTECTION_MODE_MAX ( 1 )
+#define CFG_AP_OBSS_PROTECTION_MODE_DEFAULT ( 0 )
#define CFG_AP_STA_SECURITY_SEPERATION_NAME "gDisableIntraBssFwd"
#define CFG_AP_STA_SECURITY_SEPERATION_MIN ( 0 )
-#define CFG_AP_STA_SECURITY_SEPERATION_MAX ( 1 )
-#define CFG_AP_STA_SECURITY_SEPERATION_DEFAULT ( 0 )
+#define CFG_AP_STA_SECURITY_SEPERATION_MAX ( 1 )
+#define CFG_AP_STA_SECURITY_SEPERATION_DEFAULT ( 0 )
-#define CFG_AP_LISTEN_MODE_NAME "gEnablePhyAgcListenMode"
+#define CFG_AP_LISTEN_MODE_NAME "gEnablePhyAgcListenMode"
#define CFG_AP_LISTEN_MODE_MIN (0)
-#define CFG_AP_LISTEN_MODE_MAX (128)
-#define CFG_AP_LISTEN_MODE_DEFAULT (128)
+#define CFG_AP_LISTEN_MODE_MAX (128)
+#define CFG_AP_LISTEN_MODE_DEFAULT (128)
#define CFG_AP_AUTO_SHUT_OFF "gAPAutoShutOff"
#define CFG_AP_AUTO_SHUT_OFF_MIN ( 0 )
@@ -514,11 +514,11 @@ typedef enum
#define CFG_BEACON_INTERVAL_MAX WNI_CFG_BEACON_INTERVAL_STAMAX
#define CFG_BEACON_INTERVAL_DEFAULT WNI_CFG_BEACON_INTERVAL_STADEF
-//Additional Handoff related Parameters
-#define CFG_ENABLE_IDLE_SCAN_NAME "gEnableIdleScan"
+//Additional Handoff related Parameters
+#define CFG_ENABLE_IDLE_SCAN_NAME "gEnableIdleScan"
#define CFG_ENABLE_IDLE_SCAN_MIN ( 0 )
#define CFG_ENABLE_IDLE_SCAN_MAX ( 1 )
-#define CFG_ENABLE_IDLE_SCAN_DEFAULT ( 1 )
+#define CFG_ENABLE_IDLE_SCAN_DEFAULT ( 1 )
#define CFG_ROAMING_TIME_NAME "gRoamingTime"
#define CFG_ROAMING_TIME_MIN ( 0 )
@@ -527,14 +527,14 @@ typedef enum
#define CFG_VCC_RSSI_TRIGGER_NAME "gVccRssiTrigger"
#define CFG_VCC_RSSI_TRIGGER_MIN ( 0 )
-#define CFG_VCC_RSSI_TRIGGER_MAX ( 80 )
+#define CFG_VCC_RSSI_TRIGGER_MAX ( 80 )
#define CFG_VCC_RSSI_TRIGGER_DEFAULT ( 80 )
#define CFG_VCC_UL_MAC_LOSS_THRESH_NAME "gVccUlMacLossThresh"
-#define CFG_VCC_UL_MAC_LOSS_THRESH_MIN ( 0 )
+#define CFG_VCC_UL_MAC_LOSS_THRESH_MIN ( 0 )
#define CFG_VCC_UL_MAC_LOSS_THRESH_MAX ( 9 )
#define CFG_VCC_UL_MAC_LOSS_THRESH_DEFAULT ( 9 )
-
+
#define CFG_PASSIVE_MAX_CHANNEL_TIME_NAME "gPassiveMaxChannelTime"
#define CFG_PASSIVE_MAX_CHANNEL_TIME_MIN ( 0 )
#define CFG_PASSIVE_MAX_CHANNEL_TIME_MAX ( 10000 )
@@ -707,13 +707,13 @@ typedef enum
#define CFG_QOS_WMM_80211E_ENABLED_NAME "80211eIsEnabled"
#define CFG_QOS_WMM_80211E_ENABLED_MIN (0)
-#define CFG_QOS_WMM_80211E_ENABLED_MAX (1)
-#define CFG_QOS_WMM_80211E_ENABLED_DEFAULT (0)
+#define CFG_QOS_WMM_80211E_ENABLED_MAX (1)
+#define CFG_QOS_WMM_80211E_ENABLED_DEFAULT (0)
#define CFG_QOS_WMM_UAPSD_MASK_NAME "UapsdMask" // ACs to setup U-APSD for at assoc
#define CFG_QOS_WMM_UAPSD_MASK_MIN (0x00)
-#define CFG_QOS_WMM_UAPSD_MASK_MAX (0xFF)
-#define CFG_QOS_WMM_UAPSD_MASK_DEFAULT (0x00)
+#define CFG_QOS_WMM_UAPSD_MASK_MAX (0xFF)
+#define CFG_QOS_WMM_UAPSD_MASK_DEFAULT (0x00)
#define CFG_QOS_WMM_INFRA_UAPSD_VO_SRV_INTV_NAME "InfraUapsdVoSrvIntv"
#define CFG_QOS_WMM_INFRA_UAPSD_VO_SRV_INTV_MIN (0)
@@ -727,7 +727,7 @@ typedef enum
#define CFG_QOS_WMM_INFRA_UAPSD_VI_SRV_INTV_NAME "InfraUapsdViSrvIntv"
#define CFG_QOS_WMM_INFRA_UAPSD_VI_SRV_INTV_MIN (0)
-#define CFG_QOS_WMM_INFRA_UAPSD_VI_SRV_INTV_MAX (4294967295UL)
+#define CFG_QOS_WMM_INFRA_UAPSD_VI_SRV_INTV_MAX (4294967295UL)
#define CFG_QOS_WMM_INFRA_UAPSD_VI_SRV_INTV_DEFAULT (300)
#define CFG_QOS_WMM_INFRA_UAPSD_VI_SUS_INTV_NAME "InfraUapsdViSuspIntv"
@@ -752,7 +752,7 @@ typedef enum
#define CFG_QOS_WMM_INFRA_UAPSD_BK_SUS_INTV_NAME "InfraUapsdBkSuspIntv"
#define CFG_QOS_WMM_INFRA_UAPSD_BK_SUS_INTV_MIN (0)
-#define CFG_QOS_WMM_INFRA_UAPSD_BK_SUS_INTV_MAX (4294967295UL)
+#define CFG_QOS_WMM_INFRA_UAPSD_BK_SUS_INTV_MAX (4294967295UL)
#define CFG_QOS_WMM_INFRA_UAPSD_BK_SUS_INTV_DEFAULT (2000)
#ifdef FEATURE_WLAN_CCX
@@ -782,7 +782,7 @@ typedef enum
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
// This flag will control fasttransition in case of 11r and ccx.
// Basically with this the whole neighbor roam, pre-auth, reassoc
-// can be turned ON/OFF.
+// can be turned ON/OFF.
// With this turned OFF 11r will completely not work.
// For 11r this flag has to be ON.
// For CCX fastroam will not work.
@@ -795,7 +795,7 @@ typedef enum
* AP1 is the currently associated AP and AP2 is chosen for roaming.
* The Roaming will happen only if AP2 has better Signal Quality and it has a RSSI better than AP1
* in terms of RoamRssiDiff,and RoamRssiDiff is the number of units (typically measured in dB) AP2
- * is better than AP1.
+ * is better than AP1.
* This check is not done if the value is Zero */
#define CFG_ROAM_RSSI_DIFF_NAME "RoamRssiDiff"
#define CFG_ROAM_RSSI_DIFF_MIN (0)
@@ -804,11 +804,11 @@ typedef enum
/*
* Following a scan and if potential roam candidate(s) are found,
- * then determine whether to register for reassoc threshold or roam
- * immediately based on this configuration parameter. If the RSSI
- * of any available candidate is better than the currently associated
- * AP by at least gImmediateRoamRssiDiff, then being to roam
- * immediately.
+ * then determine whether to register for reassoc threshold or roam
+ * immediately based on this configuration parameter. If the RSSI
+ * of any available candidate is better than the currently associated
+ * AP by at least gImmediateRoamRssiDiff, then being to roam
+ * immediately.
* NOTE: Value of 0 means that immediate roaming is enabled by default
*/
#define CFG_IMMEDIATE_ROAM_RSSI_DIFF_NAME "gImmediateRoamRssiDiff"
@@ -985,28 +985,28 @@ typedef enum
#if defined WLAN_FEATURE_VOWIFI
#define CFG_RRM_ENABLE_NAME "gRrmEnable"
#define CFG_RRM_ENABLE_MIN (0)
-#define CFG_RRM_ENABLE_MAX (1)
+#define CFG_RRM_ENABLE_MAX (1)
#define CFG_RRM_ENABLE_DEFAULT (0)
#define CFG_RRM_OPERATING_CHAN_MAX_DURATION_NAME "gRrmOperChanMax" //section 11.10.3 IEEE std. 802.11k-2008
#define CFG_RRM_OPERATING_CHAN_MAX_DURATION_MIN (0) //Maxduration = 2^(maxDuration - 4) * bcnIntvl.
-#define CFG_RRM_OPERATING_CHAN_MAX_DURATION_MAX (8)
+#define CFG_RRM_OPERATING_CHAN_MAX_DURATION_MAX (8)
#define CFG_RRM_OPERATING_CHAN_MAX_DURATION_DEFAULT (3) //max duration = 2^-1 * bcnIntvl (50% of bcn intvl)
#define CFG_RRM_NON_OPERATING_CHAN_MAX_DURATION_NAME "gRrmNonOperChanMax" //Same as above.
#define CFG_RRM_NON_OPERATING_CHAN_MAX_DURATION_MIN (0)
-#define CFG_RRM_NON_OPERATING_CHAN_MAX_DURATION_MAX (8)
+#define CFG_RRM_NON_OPERATING_CHAN_MAX_DURATION_MAX (8)
#define CFG_RRM_NON_OPERATING_CHAN_MAX_DURATION_DEFAULT (3)
#define CFG_RRM_MEAS_RANDOMIZATION_INTVL_NAME "gRrmRandnIntvl"
#define CFG_RRM_MEAS_RANDOMIZATION_INTVL_MIN (10)
-#define CFG_RRM_MEAS_RANDOMIZATION_INTVL_MAX (100)
+#define CFG_RRM_MEAS_RANDOMIZATION_INTVL_MAX (100)
#define CFG_RRM_MEAS_RANDOMIZATION_INTVL_DEFAULT (100)
#endif
#define CFG_QOS_IMPLICIT_SETUP_ENABLED_NAME "ImplicitQosIsEnabled"
#define CFG_QOS_IMPLICIT_SETUP_ENABLED_MIN (0)
-#define CFG_QOS_IMPLICIT_SETUP_ENABLED_MAX (1)
+#define CFG_QOS_IMPLICIT_SETUP_ENABLED_MAX (1)
#define CFG_QOS_IMPLICIT_SETUP_ENABLED_DEFAULT (1)
#define CFG_ENABLE_LOGP_NAME "gEnableLogp"
@@ -1048,7 +1048,7 @@ typedef enum
#define CFG_BTC_STATIC_LEN_LE_BT_MIN ( 5000 )
#define CFG_BTC_STATIC_LEN_LE_BT_MAX ( 500000 )
#define CFG_BTC_STATIC_LEN_LE_BT_DEFAULT ( 120000 )
-
+
#define CFG_BTC_STATIC_LEN_INQ_WLAN_NAME "btcStaticLenInqWlan"
#define CFG_BTC_STATIC_LEN_INQ_WLAN_MIN ( 0 )
#define CFG_BTC_STATIC_LEN_INQ_WLAN_MAX ( 500000 )
@@ -1219,14 +1219,14 @@ typedef enum
#define CFG_NEIGHBOR_SCAN_CHAN_LIST_DEFAULT ""
#define CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_NAME "gNeighborScanChannelMinTime"
-#define CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MIN (10)
-#define CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MAX (40)
-#define CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_DEFAULT (20)
+#define CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MIN (10)
+#define CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MAX (40)
+#define CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_DEFAULT (20)
#define CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_NAME "gNeighborScanChannelMaxTime"
#define CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_MIN (3)
#define CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_MAX (300)
-#define CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_DEFAULT (30)
+#define CFG_NEIGHBOR_SCAN_MAX_CHAN_TIME_DEFAULT (30)
#define CFG_11R_NEIGHBOR_REQ_MAX_TRIES_NAME "gMaxNeighborReqTries"
#define CFG_11R_NEIGHBOR_REQ_MAX_TRIES_MIN (1)
@@ -1245,20 +1245,20 @@ typedef enum
#define CFG_EMPTY_SCAN_REFRESH_PERIOD_DEFAULT (0)
#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
-#define CFG_QOS_WMM_BURST_SIZE_DEFN_NAME "burstSizeDefinition"
+#define CFG_QOS_WMM_BURST_SIZE_DEFN_NAME "burstSizeDefinition"
#define CFG_QOS_WMM_BURST_SIZE_DEFN_MIN (0)
#define CFG_QOS_WMM_BURST_SIZE_DEFN_MAX (1)
#define CFG_QOS_WMM_BURST_SIZE_DEFN_DEFAULT (0)
-#define CFG_QOS_WMM_TS_INFO_ACK_POLICY_NAME "tsInfoAckPolicy"
+#define CFG_QOS_WMM_TS_INFO_ACK_POLICY_NAME "tsInfoAckPolicy"
#define CFG_QOS_WMM_TS_INFO_ACK_POLICY_MIN (0x00)
#define CFG_QOS_WMM_TS_INFO_ACK_POLICY_MAX (0x01)
#define CFG_QOS_WMM_TS_INFO_ACK_POLICY_DEFAULT (0x00)
#define CFG_SINGLE_TID_RC_NAME "SingleTIDRC"
#define CFG_SINGLE_TID_RC_MIN (0) // Seperate replay counter for all TID
-#define CFG_SINGLE_TID_RC_MAX (1) // Single replay counter for all TID
-#define CFG_SINGLE_TID_RC_DEFAULT (1)
+#define CFG_SINGLE_TID_RC_MAX (1) // Single replay counter for all TID
+#define CFG_SINGLE_TID_RC_DEFAULT (1)
#define CFG_MCAST_BCAST_FILTER_SETTING_NAME "McastBcastFilter"
#define CFG_MCAST_BCAST_FILTER_SETTING_MIN (0)
#define CFG_MCAST_BCAST_FILTER_SETTING_MAX (3)
@@ -1282,7 +1282,7 @@ typedef enum
#define CFG_VALIDATE_SCAN_LIST_NAME "gValidateScanList"
#define CFG_VALIDATE_SCAN_LIST_MIN (0)
-#define CFG_VALIDATE_SCAN_LIST_MAX (1)
+#define CFG_VALIDATE_SCAN_LIST_MAX (1)
#define CFG_VALIDATE_SCAN_LIST_DEFAULT (0)
#define CFG_NULLDATA_AP_RESP_TIMEOUT_NAME "gNullDataApRespTimeout"
@@ -1551,7 +1551,7 @@ typedef enum
* Enable Dynamic DTIM
* Options
* 0 -Disable DynamicDTIM
- * 1 to 5 - SLM will switch to DTIM specified here when host suspends and
+ * 1 to 5 - SLM will switch to DTIM specified here when host suspends and
* switch DTIM1 when host resumes */
#define CFG_ENABLE_DYNAMIC_DTIM_NAME "gEnableDynamicDTIM"
#define CFG_ENABLE_DYNAMIC_DTIM_MIN ( 0 )
@@ -1622,7 +1622,7 @@ typedef enum
* disconnection.
* gAllowMCCGODiffBI = 2 //If set to 2 workaround 1 disassoc all the clients
* and update beacon Interval
- * gAllowMCCGODiffBI = 3 //If set to 3 tear down the P2P link in auto/
+ * gAllowMCCGODiffBI = 3 //If set to 3 tear down the P2P link in auto/
* Non-autonomous -GO case
* gAllowMCCGODiffBI = 4 //If set to 4 don't disconnect the P2P client
* in autonomous/Non-autonomous -GO case update
@@ -1637,10 +1637,10 @@ typedef enum
* Enable/Disable Thermal Mitigation feature
* Default: Disable
*/
-#define CFG_THERMAL_MIGRATION_ENABLE_NAME "gThermalMitigationEnable"
-#define CFG_THERMAL_MIGRATION_ENABLE_MIN ( 0 )
-#define CFG_THERMAL_MIGRATION_ENABLE_MAX ( 1 )
-#define CFG_THERMAL_MIGRATION_ENABLE_DEFAULT ( 0 )
+#define CFG_THERMAL_MIGRATION_ENABLE_NAME "gThermalMitigationEnable"
+#define CFG_THERMAL_MIGRATION_ENABLE_MIN ( 0 )
+#define CFG_THERMAL_MIGRATION_ENABLE_MAX ( 1 )
+#define CFG_THERMAL_MIGRATION_ENABLE_DEFAULT ( 0 )
/*
* Enable/Disable Modulated DTIM feature
@@ -1689,8 +1689,8 @@ typedef enum
#define CFG_ENABLE_RX_LDPC_MAX ( 1 )
#define CFG_ENABLE_RX_LDPC_DEFAULT ( 0 )
-/*
- * Enable/Disable vsta based on MAX Assoc limit
+/*
+ * Enable/Disable vsta based on MAX Assoc limit
* defined in WCNSS_qcom_cfg.ini.
*/
#ifdef WLAN_SOFTAP_VSTA_FEATURE
@@ -1811,8 +1811,8 @@ typedef enum
#define CFG_SCAN_AGING_PARAM_MAX ( 200 )
#define CFG_SCAN_AGING_PARAM_DEFAULT ( 60 )
-/* Config Param to enable the txLdpc capability
- * 0 - disable
+/* Config Param to enable the txLdpc capability
+ * 0 - disable
* 1 - HT LDPC enable
* 2 - VHT LDPC enable
* 3 - HT & VHT LDPC enable */
@@ -1825,7 +1825,7 @@ typedef enum
* Enable / Disable MCC Adaptive Scheduler feature
* Default: Enable
*/
-#define CFG_ENABLE_MCC_ADATIVE_SCHEDULER_ENABLED_NAME "gEnableMCCAdaptiveScheduler"
+#define CFG_ENABLE_MCC_ADATIVE_SCHEDULER_ENABLED_NAME "gEnableMCCAdaptiveScheduler"
#define CFG_ENABLE_MCC_ADATIVE_SCHEDULER_ENABLED_MIN ( 0 )
#define CFG_ENABLE_MCC_ADATIVE_SCHEDULER_ENABLED_MAX ( 1 )
#define CFG_ENABLE_MCC_ADATIVE_SCHEDULER_ENABLED_DEFAULT ( 1 )
@@ -2009,6 +2009,48 @@ This feature requires the dependent cfg.ini "gRoamPrefer5GHz" set to 1 */
#define CFG_POWERSAVE_OFFLOAD_MAX ( 4 )
#define CFG_POWERSAVE_OFFLOAD_DEFAULT ( CFG_POWERSAVE_OFFLOAD_MIN )
+#ifdef IPA_OFFLOAD
+/*
+ * IPA Offload
+ */
+#define CFG_IPA_OFFLOAD_NAME "gIPAEnable"
+#define CFG_IPA_OFFLOAD_DISABLE ( 0 )
+#define CFG_IPA_OFFLOAD_ENABLE ( 1 )
+#define CFG_IPA_OFFLOAD_DEFAULT ( CFG_IPA_OFFLOAD_ENABLE )
+
+/*
+ * IPA IPv6 Offload
+ */
+#define CFG_IPA_IPV6_OFFLOAD_NAME "gIPAIPv6Enable"
+#define CFG_IPA_IPV6_OFFLOAD_DISABLE ( 0 )
+#define CFG_IPA_IPV6_OFFLOAD_ENABLE ( 1 )
+#define CFG_IPA_IPV6_OFFLOAD_DEFAULT ( CFG_IPA_IPV6_OFFLOAD_DISABLE )
+
+/*
+ * IPA DESC SIZE
+ */
+#define CFG_IPA_DESC_SIZE_NAME "gIPADescSize"
+#define CFG_IPA_DESC_SIZE_MIN ( 800 )
+#define CFG_IPA_DESC_SIZE_MAX ( 8000 )
+#define CFG_IPA_DESC_SIZE_DEFAULT ( 800 )
+
+/*
+ * IPA PRE FILTER
+ */
+#define CFG_IPA_PRE_FILTER_NAME "gIPAPreFilterEnable"
+#define CFG_IPA_PRE_FILTER_DISABLE ( 0 )
+#define CFG_IPA_PRE_FILTER_ENABLE ( 1 )
+#define CFG_IPA_PRE_FILTER_DEFAULT ( CFG_IPA_PRE_FILTER_ENABLE )
+
+/*
+ * IPA IPA RESOURCE MANAGER
+ */
+#define CFG_IPA_RM_NAME "gIPARMEnable"
+#define CFG_IPA_RM_DISABLE ( 0 )
+#define CFG_IPA_RM_ENABLE ( 1 )
+#define CFG_IPA_RM_DEFAULT ( CFG_IPA_RM_DISABLE )
+#endif
+
/*
* P2P Listen Offload
*/
@@ -2073,9 +2115,9 @@ This feature requires the dependent cfg.ini "gRoamPrefer5GHz" set to 1 */
#define CFG_SAP_MAX_NO_PEERS_MAX (32)
#define CFG_SAP_MAX_NO_PEERS_DEFAULT (14)
-/*---------------------------------------------------------------------------
+/*---------------------------------------------------------------------------
Type declarations
- -------------------------------------------------------------------------*/
+ -------------------------------------------------------------------------*/
typedef struct
{
@@ -2207,8 +2249,8 @@ typedef struct
v_U8_t nNeighborReassocRssiThreshold;
v_U8_t nNeighborLookupRssiThreshold;
v_U8_t neighborScanChanList[WNI_CFG_VALID_CHANNEL_LIST_LEN];
- v_U16_t nNeighborScanMinChanTime;
- v_U16_t nNeighborScanMaxChanTime;
+ v_U16_t nNeighborScanMinChanTime;
+ v_U16_t nNeighborScanMaxChanTime;
v_U16_t nMaxNeighborReqTries;
v_U16_t nNeighborResultsRefreshPeriod;
v_U16_t nEmptyScanRefreshPeriod;
@@ -2323,9 +2365,9 @@ typedef struct
v_U32_t DelayedTriggerFrmInt;
/* Wowl pattern */
- char wowlPattern[1024];
+ char wowlPattern[1024];
- /* Control for Replay counetr. value 1 means
+ /* Control for Replay counetr. value 1 means
single replay counter for all TID*/
v_BOOL_t bSingleTidRc;
v_U8_t mcastBcastFilterSetting;
@@ -2336,7 +2378,7 @@ typedef struct
v_BOOL_t fhostNSOffload;
v_BOOL_t burstSizeDefinition;
v_U8_t tsInfoAckPolicy;
-
+
/* RF Settling Time Clock */
v_U32_t rfSettlingTimeUs;
v_U8_t enableBtAmp;
@@ -2426,7 +2468,7 @@ typedef struct
v_BOOL_t enableRxSTBC;
v_BOOL_t enableTxSTBC;
v_BOOL_t enableRxLDPC;
-#ifdef FEATURE_WLAN_TDLS
+#ifdef FEATURE_WLAN_TDLS
v_BOOL_t fEnableTDLSSupport;
v_BOOL_t fEnableTDLSImplicitTrigger;
v_U32_t fTDLSTxStatsPeriod;
@@ -2504,13 +2546,20 @@ typedef struct
v_U8_t fVhtAmpduLenExponent;
v_U32_t vhtMpduLen;
#endif
+#ifdef IPA_OFFLOAD
+ v_BOOL_t IpaEnable;
+ v_BOOL_t IpaIPv6Enable;
+ v_BOOL_t IpaPreFilterEnable;
+ v_BOOL_t IpaRMEnable;
+ v_U32_t IpaDescSize;
+#endif
v_U8_t maxWoWFilters;
v_U8_t wowEnable;
v_U8_t maxNumberOfPeers;
} hdd_config_t;
-/*---------------------------------------------------------------------------
+/*---------------------------------------------------------------------------
Function declarations and documenation
- -------------------------------------------------------------------------*/
+ -------------------------------------------------------------------------*/
VOS_STATUS hdd_parse_config_ini(hdd_context_t *pHddCtx);
VOS_STATUS hdd_set_sme_config( hdd_context_t *pHddCtx );
VOS_STATUS hdd_set_sme_chan_list(hdd_context_t *hdd_ctx);
@@ -2543,7 +2592,7 @@ VOS_STATUS hdd_set_idle_ps_config(hdd_context_t *pHddCtx, v_U32_t val);
// modified dynamicially
// on a running system
-typedef enum
+typedef enum
{
WLAN_PARAM_Integer,
WLAN_PARAM_SignedInteger,
diff --git a/CORE/HDD/inc/wlan_hdd_ipa.h b/CORE/HDD/inc/wlan_hdd_ipa.h
new file mode 100644
index 000000000000..652bf1b178ed
--- /dev/null
+++ b/CORE/HDD/inc/wlan_hdd_ipa.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ *
+ * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+ *
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This file was originally distributed by Qualcomm Atheros, Inc.
+ * under proprietary terms before Copyright ownership was assigned
+ * to the Linux Foundation.
+ */
+
+#ifndef HDD_IPA_H__
+#define HDD_IPA_H__
+
+/**===========================================================================
+
+ \file wlan_hdd_ipa.h
+
+ \brief WLAN IPA interface module headers
+
+ ==========================================================================*/
+
+/* $HEADER$ */
+
+/*---------------------------------------------------------------------------
+ Include files
+ -------------------------------------------------------------------------*/
+#ifdef IPA_OFFLOAD
+#include <mach/ipa.h>
+
+VOS_STATUS hdd_ipa_init(hdd_context_t *pHddCtx);
+VOS_STATUS hdd_ipa_cleanup(hdd_context_t *pHddCtx);
+int hdd_ipa_wlan_evt(void *pAdapter, uint8_t sta_id,
+ enum ipa_wlan_event type, uint8_t *mac_addr);
+VOS_STATUS hdd_ipa_process_rxt(v_VOID_t *vosContext, adf_nbuf_t rxBuf,
+ v_U8_t staId);
+bool hdd_ipa_is_enabled(hdd_context_t *pHddCtx);
+#endif
+
+#endif
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index f946e56a8232..245c104caf49 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -27,17 +27,17 @@
#if !defined( WLAN_HDD_MAIN_H )
#define WLAN_HDD_MAIN_H
/**===========================================================================
-
+
\file WLAN_HDD_MAIN_H.h
-
+
\brief Linux HDD Adapter Type
==========================================================================*/
-
-/*---------------------------------------------------------------------------
+
+/*---------------------------------------------------------------------------
Include files
- -------------------------------------------------------------------------*/
-
+ -------------------------------------------------------------------------*/
+
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <net/cfg80211.h>
@@ -57,13 +57,13 @@
#ifdef FEATURE_WLAN_TDLS
#include "wlan_hdd_tdls.h"
#endif
-/*---------------------------------------------------------------------------
+/*---------------------------------------------------------------------------
Preprocessor definitions and constants
-------------------------------------------------------------------------*/
/** Number of attempts to detect/remove card */
#define LIBRA_CARD_INSERT_DETECT_MAX_COUNT 5
#define LIBRA_CARD_REMOVE_DETECT_MAX_COUNT 5
-/** Number of Tx Queues */
+/** Number of Tx Queues */
#define NUM_TX_QUEUES 4
/** HDD's internal Tx Queue Length. Needs to be a power of 2 */
#define HDD_TX_QUEUE_MAX_LEN 128
@@ -75,9 +75,9 @@
#define LIBRA_HW_NEEDED_HEADROOM 128
/** Hdd Tx Time out value */
#ifdef LIBRA_LINUX_PC
-#define HDD_TX_TIMEOUT (8000)
+#define HDD_TX_TIMEOUT (8000)
#else
-#define HDD_TX_TIMEOUT msecs_to_jiffies(5000)
+#define HDD_TX_TIMEOUT msecs_to_jiffies(5000)
#endif
/** Hdd Default MTU */
#define HDD_DEFAULT_MTU (1500)
@@ -309,10 +309,10 @@ typedef struct hdd_stats_s
typedef enum
{
HDD_ROAM_STATE_NONE,
-
- // Issuing a disconnect due to transition into low power states.
+
+ // Issuing a disconnect due to transition into low power states.
HDD_ROAM_STATE_DISCONNECTING_POWER,
-
+
// move to this state when HDD sets a key with SME/CSR. Note this is
// an important state to get right because we will get calls into our SME
// callback routine for SetKey activity that we did not initiate!
@@ -336,7 +336,7 @@ typedef struct roaming_info_s
tANI_U32 roamId;
eRoamCmdStatus roamStatus;
v_BOOL_t deferKeyComplete;
-
+
} roaming_info_t;
#ifdef FEATURE_WLAN_WAPI
@@ -546,7 +546,7 @@ typedef enum {
WLAN_HDD_PROV_DIS_RESP,
}tActionFrmType;
-typedef struct hdd_cfg80211_state_s
+typedef struct hdd_cfg80211_state_s
{
tANI_U16 current_freq;
u64 action_cookie;
@@ -594,14 +594,14 @@ struct hdd_station_ctx
v_BOOL_t hdd_ReassocScenario;
};
-#define BSS_STOP 0
+#define BSS_STOP 0
#define BSS_START 1
typedef struct hdd_hostapd_state_s
{
int bssState;
vos_event_t vosEvent;
VOS_STATUS vosStatus;
- v_BOOL_t bCommit;
+ v_BOOL_t bCommit;
} hdd_hostapd_state_t;
@@ -629,7 +629,7 @@ typedef struct {
/** Might need to differentiate queue depth in contention case */
v_U16_t aTxQueueDepth[NUM_TX_QUEUES];
-
+
/**Track whether OS TX queue has been disabled.*/
v_BOOL_t txSuspended[NUM_TX_QUEUES];
@@ -666,19 +666,19 @@ struct hdd_ap_ctx_s
tsap_Config_t sapConfig;
struct semaphore semWpsPBCOverlapInd;
-
+
v_BOOL_t apDisableIntraBssFwd;
-
+
vos_timer_t hdd_ap_inactivity_timer;
v_U8_t operatingChannel;
-
+
v_BOOL_t uIsAuthenticated;
eCsrEncryptionType ucEncryptType;
-
- //This will point to group key data, if it is received before start bss.
- tCsrRoamSetKey groupKey;
+
+ //This will point to group key data, if it is received before start bss.
+ tCsrRoamSetKey groupKey;
// This will have WEP key data, if it is received before start bss
tCsrRoamSetKey wepKey[CSR_MAX_NUM_KEY];
@@ -693,7 +693,7 @@ struct hdd_mon_ctx_s
typedef struct hdd_scaninfo_s
{
/* The scan id */
- v_U32_t scanId;
+ v_U32_t scanId;
/* The scan pending */
v_U32_t mScanPending;
@@ -706,7 +706,7 @@ typedef struct hdd_scaninfo_s
v_U32_t waitScanResult;
/* Additional IE for scan */
- tSirAddie scanAddIE;
+ tSirAddie scanAddIE;
/* Scan mode*/
tSirScanType scan_mode;
@@ -791,26 +791,26 @@ struct hdd_adapter_s
{
void *pHddCtx;
- device_mode_t device_mode;
+ device_mode_t device_mode;
/** Handle to the network device */
struct net_device *dev;
-
+
//TODO Move this to sta Ctx
struct wireless_dev wdev ;
- struct cfg80211_scan_request *request ;
+ struct cfg80211_scan_request *request ;
/** ops checks if Opportunistic Power Save is Enable or Not
- * ctw stores ctWindow value once we receive Opps command from
- * wpa_supplicant then using ctWindow value we need to Enable
+ * ctw stores ctWindow value once we receive Opps command from
+ * wpa_supplicant then using ctWindow value we need to Enable
* Opportunistic Power Save
*/
tANI_U8 ops;
tANI_U32 ctw;
- /** Current MAC Address for the adapter */
- v_MACADDR_t macAddressCurrent;
-
+ /** Current MAC Address for the adapter */
+ v_MACADDR_t macAddressCurrent;
+
/**Event Flags*/
unsigned long event_flags;
@@ -820,7 +820,7 @@ struct hdd_adapter_s
hdd_stats_t hdd_stats;
/**Mib information*/
sHddMib_t hdd_mib;
-
+
tANI_U8 sessionId;
/* Completion variable for session close */
@@ -829,7 +829,7 @@ struct hdd_adapter_s
/* Completion variable for session open */
struct completion session_open_comp_var;
- //TODO: move these to sta ctx. These may not be used in AP
+ //TODO: move these to sta ctx. These may not be used in AP
/** completion variable for disconnect callback */
struct completion disconnect_comp_var;
@@ -878,7 +878,7 @@ struct hdd_adapter_s
/**Track whether 3/4th of resources are used */
v_BOOL_t isVosLowResource;
-
+
/**Track whether OS TX queue has been disabled.*/
v_BOOL_t isTxSuspended[NUM_TX_QUEUES];
@@ -891,7 +891,7 @@ struct hdd_adapter_s
*/
/** Multiple station supports */
/** Per-station structure */
- spinlock_t staInfo_lock; //To protect access to station Info
+ spinlock_t staInfo_lock; //To protect access to station Info
hdd_station_info_t aStaInfo[WLAN_MAX_STA_COUNT];
//v_U8_t uNumActiveStation;
@@ -902,7 +902,7 @@ struct hdd_adapter_s
#ifdef FEATURE_WLAN_WAPI
hdd_wapi_info_t wapi_info;
#endif
-
+
v_S7_t rssi;
tANI_U8 snr;
@@ -1030,30 +1030,30 @@ struct hdd_context_s
/** Pointer for firmware image data */
const struct firmware *fw;
-
+
/** Pointer for configuration data */
const struct firmware *cfg;
-
+
/** Pointer for nv data */
const struct firmware *nv;
-
+
/** Pointer to the parent device */
struct device *parent_dev;
pid_t pid_sdio_claimed;
atomic_t sdio_claim_count;
- /** Config values read from qcom_cfg.ini file */
+ /** Config values read from qcom_cfg.ini file */
hdd_config_t *cfg_ini;
- wlan_hdd_ftm_status_t ftm;
+ wlan_hdd_ftm_status_t ftm;
/** completion variable for full power callback */
struct completion full_pwr_comp_var;
/** completion variable for Request BMPS callback */
struct completion req_bmps_comp_var;
-
+
/** completion variable for standby callback */
struct completion standby_comp_var;
-
+
/* Completion variable to indicate Rx Thread Suspended */
struct completion rx_sus_event_var;
@@ -1086,26 +1086,26 @@ struct hdd_context_s
volatile v_BOOL_t isLogpInProgress;
v_BOOL_t isLoadUnloadInProgress;
-
+
/**Track whether driver has been suspended.*/
hdd_ps_state_t hdd_ps_state;
-
+
/* Track whether Mcast/Bcast Filter is enabled.*/
v_BOOL_t hdd_mcastbcast_filter_set;
/* Track whether ignore DTIM is enabled*/
v_BOOL_t hdd_ignore_dtim_enabled;
v_U32_t hdd_actual_ignore_DTIM_value;
- v_U32_t hdd_actual_LI_value;
+ v_U32_t hdd_actual_LI_value;
+
-
v_BOOL_t hdd_wlan_suspended;
-
+
spinlock_t filter_lock;
-
+
/* Lock to avoid race condtion during start/stop bss*/
struct mutex sap_lock;
-
+
/** ptt Process ID*/
v_SINT_t ptt_pid;
#ifdef WLAN_KD_READY_NOTIFIER
@@ -1132,10 +1132,10 @@ struct hdd_context_s
hdd_chip_reset_stats_t hddChipResetStats;
/* Number of times riva restarted */
v_U32_t hddRivaResetStats;
-
+
/* Can we allow AMP connection right now*/
v_BOOL_t isAmpAllowed;
-
+
/** P2P Device MAC Address for the adapter */
v_MACADDR_t p2pDeviceAddress;
@@ -1148,8 +1148,8 @@ struct hdd_context_s
#endif
#endif
- /*
- * Framework initiated driver restarting
+ /*
+ * Framework initiated driver restarting
* hdd_reload_timer : Restart retry timer
* isRestartInProgress: Restart in progress
* hdd_restart_retries: Restart retries
@@ -1158,7 +1158,7 @@ struct hdd_context_s
vos_timer_t hdd_restart_timer;
atomic_t isRestartInProgress;
u_int8_t hdd_restart_retries;
-
+
/*is_dyanmic_channel_range_set is set to 1 when Softap_set_channel_range
is invoked*/
v_BOOL_t is_dynamic_channel_range_set;
@@ -1180,6 +1180,9 @@ struct hdd_context_s
hdd_traffic_monitor_t traffic_monitor;
+#ifdef IPA_OFFLOAD
+ void *hdd_ipa;
+#endif
/* MC/BC Filter state variable
* This always contains the value that is currently
* configured
@@ -1227,9 +1230,9 @@ struct hdd_context_s
-/*---------------------------------------------------------------------------
+/*---------------------------------------------------------------------------
Function declarations and documenation
- -------------------------------------------------------------------------*/
+ -------------------------------------------------------------------------*/
VOS_STATUS hdd_get_front_adapter( hdd_context_t *pHddCtx,
hdd_adapter_list_node_t** ppAdapterNode);
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index d24fc863a61e..73c13b18092c 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -63,6 +63,9 @@
#endif
#include "sme_Api.h"
+#ifdef IPA_OFFLOAD
+#include <wlan_hdd_ipa.h>
+#endif
v_BOOL_t mibIsDot11DesiredBssTypeInfrastructure( hdd_adapter_t *pAdapter );
struct ether_addr
@@ -780,6 +783,12 @@ static eHalStatus hdd_DisConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *
netif_tx_disable(dev);
netif_carrier_off(dev);
+#ifdef IPA_OFFLOAD
+ if (hdd_ipa_is_enabled(pHddCtx))
+ hdd_ipa_wlan_evt(pAdapter, pHddStaCtx->conn_info.staId[0],
+ WLAN_STA_DISCONNECT, pAdapter->dev->dev_addr);
+#endif
+
if(pHddStaCtx->conn_info.connState != eConnectionState_Disconnecting)
{
INIT_COMPLETION(pAdapter->disconnect_comp_var);
@@ -1034,11 +1043,23 @@ static VOS_STATUS hdd_roamRegisterSTA( hdd_adapter_t *pAdapter,
WLANTL_STA_CONNECTED : WLANTL_STA_AUTHENTICATED;
// Register the Station with TL...
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "%s: HDD register TL ucInitState=%d", __func__, staDesc.ucInitState );
+#ifdef IPA_OFFLOAD
+ if (hdd_ipa_is_enabled(pHddCtx)) {
+ vosStatus = WLANTL_RegisterSTAClient( pHddCtx->pvosContext,
+ hdd_ipa_process_rxt,
+ hdd_tx_complete_cbk,
+ hdd_tx_fetch_packet_cbk, &staDesc,
+ pBssDesc->rssi );
+ } else {
+#endif
vosStatus = WLANTL_RegisterSTAClient( pHddCtx->pvosContext,
hdd_rx_packet_cbk,
hdd_tx_complete_cbk,
hdd_tx_fetch_packet_cbk, &staDesc,
pBssDesc->rssi );
+#ifdef IPA_OFFLOAD
+ }
+#endif
if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
{
@@ -1240,6 +1261,12 @@ static eHalStatus hdd_AssociationCompletionHandler( hdd_adapter_t *pAdapter, tCs
#endif
pHddCtx->sta_to_adapter[pRoamInfo->staId] = pAdapter;
+#ifdef IPA_OFFLOAD
+ if (hdd_ipa_is_enabled(pHddCtx))
+ hdd_ipa_wlan_evt(pAdapter, pRoamInfo->staId, WLAN_STA_CONNECT,
+ pAdapter->dev->dev_addr);
+#endif
+
#ifdef FEATURE_WLAN_TDLS
wlan_hdd_tdls_connection_callback(pAdapter);
#endif
@@ -2144,10 +2171,21 @@ VOS_STATUS hdd_roamRegisterTDLSSTA( hdd_adapter_t *pAdapter,
staDesc.ucInitState = WLANTL_STA_CONNECTED ;
/* Register the Station with TL... */
+#ifdef IPA_OFFLOAD
+ if (hdd_ipa_is_enabled(pHddCtx)) {
+ vosStatus = WLANTL_RegisterSTAClient( pVosContext,
+ hdd_ipa_process_rxt,
+ hdd_tx_complete_cbk,
+ hdd_tx_fetch_packet_cbk, &staDesc, 0 );
+ } else {
+#endif
vosStatus = WLANTL_RegisterSTAClient( pVosContext,
hdd_rx_packet_cbk,
hdd_tx_complete_cbk,
hdd_tx_fetch_packet_cbk, &staDesc, 0 );
+#ifdef IPA_OFFLOAD
+ }
+#endif
if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
{
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 9957fa176d8f..9892d527c5dd 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -2912,6 +2912,42 @@ REG_VARIABLE( CFG_ENABLE_FW_LOG_NAME, WLAN_PARAM_Integer,
CFG_ENABLE_FW_LOG_DISABLE,
CFG_ENABLE_FW_LOG_ENABLE),
+#ifdef IPA_OFFLOAD
+REG_VARIABLE( CFG_IPA_OFFLOAD_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, IpaEnable,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_IPA_OFFLOAD_DEFAULT,
+ CFG_IPA_OFFLOAD_DISABLE,
+ CFG_IPA_OFFLOAD_ENABLE ),
+
+REG_VARIABLE( CFG_IPA_IPV6_OFFLOAD_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, IpaIPv6Enable,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_IPA_IPV6_OFFLOAD_DEFAULT,
+ CFG_IPA_IPV6_OFFLOAD_DISABLE,
+ CFG_IPA_IPV6_OFFLOAD_ENABLE ),
+
+REG_VARIABLE( CFG_IPA_DESC_SIZE_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, IpaDescSize,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_IPA_DESC_SIZE_DEFAULT,
+ CFG_IPA_DESC_SIZE_MIN,
+ CFG_IPA_DESC_SIZE_MAX ),
+
+REG_VARIABLE( CFG_IPA_PRE_FILTER_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, IpaPreFilterEnable,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_IPA_PRE_FILTER_DEFAULT,
+ CFG_IPA_PRE_FILTER_DISABLE,
+ CFG_IPA_PRE_FILTER_ENABLE ),
+
+REG_VARIABLE( CFG_IPA_RM_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, IpaRMEnable,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_IPA_RM_DEFAULT,
+ CFG_IPA_RM_DISABLE,
+ CFG_IPA_RM_ENABLE ),
+#endif
REG_VARIABLE( CFG_P2P_LISTEN_OFFLOAD_NAME, WLAN_PARAM_Integer,
hdd_config_t, fP2pListenOffload,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -3356,6 +3392,13 @@ static void print_hdd_cfg(hdd_context_t *pHddCtx)
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [nSelect5GHzMargin] Value = [%u] ",pHddCtx->cfg_ini->nSelect5GHzMargin);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gCoalesingInIBSS] Value = [%u] ",pHddCtx->cfg_ini->isCoalesingInIBSSAllowed);
+#ifdef IPA_OFFLOAD
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gIPAEnable] Value = [%u] ",pHddCtx->cfg_ini->IpaEnable);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gIPAIPv6Enable] Value = [%u] ",pHddCtx->cfg_ini->IpaIPv6Enable);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gIPARMEnable] Value = [%u] ",pHddCtx->cfg_ini->IpaRMEnable);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gIPAPreFilterEnable] Value = [%u] ",pHddCtx->cfg_ini->IpaPreFilterEnable);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gIPADescSize] Value = [%u] ",pHddCtx->cfg_ini->IpaDescSize);
+#endif
}
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 2d619df6b8ee..93e4edab15db 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -25,30 +25,30 @@
* to the Linux Foundation.
*/
/**========================================================================
-
+
\file wlan_hdd_hostapd.c
\brief WLAN Host Device Driver implementation
========================================================================*/
-/**=========================================================================
- EDIT HISTORY FOR FILE
-
-
- This section contains comments describing changes made to the module.
- Notice that changes are listed in reverse chronological order.
-
- $Header:$ $DateTime: $ $Author: $
-
-
- when who what, where, why
+/**=========================================================================
+ EDIT HISTORY FOR FILE
+
+
+ This section contains comments describing changes made to the module.
+ Notice that changes are listed in reverse chronological order.
+
+ $Header:$ $DateTime: $ $Author: $
+
+
+ when who what, where, why
-------- --- --------------------------------------------------------
- 04/5/09 Shailender Created module.
+ 04/5/09 Shailender Created module.
06/03/10 js - Added support to hostapd driven deauth/disassoc/mic failure
==========================================================================*/
/*--------------------------------------------------------------------------
Include Files
------------------------------------------------------------------------*/
-
+
#include <linux/version.h>
#include <linux/module.h>
#include <linux/kernel.h>
@@ -72,6 +72,9 @@
#include "wlan_btc_svc.h"
#include <bap_hdd_main.h>
#include "wlan_hdd_p2p.h"
+#ifdef IPA_OFFLOAD
+#include <wlan_hdd_ipa.h>
+#endif
#include "cfgApi.h"
#include "wniCfgAp.h"
@@ -96,21 +99,21 @@ extern int process_wma_set_command(int sessid, int paramid,
*/
#define WE_SAP_MAX_STA_INFO 0x7FF
-#define SAP_24GHZ_CH_COUNT (14)
+#define SAP_24GHZ_CH_COUNT (14)
-/*---------------------------------------------------------------------------
+/*---------------------------------------------------------------------------
* Function definitions
*-------------------------------------------------------------------------*/
/**---------------------------------------------------------------------------
-
+
\brief hdd_hostapd_open() - HDD Open function for hostapd interface
-
+
This is called in response to ifconfig up
-
+
\param - dev Pointer to net_device structure
-
+
\return - 0 for success non-zero for failure
-
+
--------------------------------------------------------------------------*/
int hdd_hostapd_open (struct net_device *dev)
{
@@ -118,22 +121,22 @@ int hdd_hostapd_open (struct net_device *dev)
//Turn ON carrier state
netif_carrier_on(dev);
- //Enable all Tx queues
+ //Enable all Tx queues
netif_tx_start_all_queues(dev);
-
+
EXIT();
return 0;
}
/**---------------------------------------------------------------------------
-
+
\brief hdd_hostapd_stop() - HDD stop function for hostapd interface
-
+
This is called in response to ifconfig down
-
+
\param - dev Pointer to net_device structure
-
+
\return - 0 for success non-zero for failure
-
+
--------------------------------------------------------------------------*/
int hdd_hostapd_stop (struct net_device *dev)
{
@@ -141,7 +144,7 @@ int hdd_hostapd_stop (struct net_device *dev)
//Stop all tx queues
netif_tx_disable(dev);
-
+
//Turn OFF carrier state
netif_carrier_off(dev);
@@ -179,19 +182,19 @@ static void hdd_hostapd_uninit (struct net_device *dev)
/**============================================================================
- @brief hdd_hostapd_hard_start_xmit() - Function registered with the Linux OS for
+ @brief hdd_hostapd_hard_start_xmit() - Function registered with the Linux OS for
transmitting packets. There are 2 versions of this function. One that uses
locked queue and other that uses lockless queues. Both have been retained to
do some performance testing
@param skb : [in] pointer to OS packet (sk_buff)
@param dev : [in] pointer to Libra network device
-
+
@return : NET_XMIT_DROP if packets are dropped
: NET_XMIT_SUCCESS if packet is enqueued succesfully
===========================================================================*/
int hdd_hostapd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
- return 0;
+ return 0;
}
int hdd_hostapd_change_mtu(struct net_device *dev, int new_mtu)
{
@@ -259,7 +262,7 @@ int hdd_hostapd_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
"***HOSTAPD*** : Received %s cmd from Wi-Fi GUI***", command);
- if(strncmp(command, "P2P_SET_NOA", 11) == 0 )
+ if(strncmp(command, "P2P_SET_NOA", 11) == 0 )
{
hdd_setP2pNoa(dev, command);
}
@@ -289,15 +292,15 @@ exit:
}
/**---------------------------------------------------------------------------
-
- \brief hdd_hostapd_set_mac_address() -
- This function sets the user specified mac address using
+
+ \brief hdd_hostapd_set_mac_address() -
+ This function sets the user specified mac address using
the command ifconfig wlanX hw ether <mac adress>.
-
+
\param - dev - Pointer to the net device.
- addr - Pointer to the sockaddr.
\return - 0 for success, non zero for failure
-
+
--------------------------------------------------------------------------*/
static int hdd_hostapd_set_mac_address(struct net_device *dev, void *addr)
@@ -313,7 +316,7 @@ void hdd_hostapd_inactivity_timer_cb(v_PVOID_t usrDataForCallback)
struct net_device *dev = (struct net_device *)usrDataForCallback;
v_BYTE_t we_custom_event[64];
union iwreq_data wrqu;
-#ifdef DISABLE_CONCURRENCY_AUTOSAVE
+#ifdef DISABLE_CONCURRENCY_AUTOSAVE
VOS_STATUS vos_status;
hdd_adapter_t *pHostapdAdapter;
hdd_ap_ctx_t *pHddApCtx;
@@ -326,21 +329,21 @@ void hdd_hostapd_inactivity_timer_cb(v_PVOID_t usrDataForCallback)
ENTER();
-#ifdef DISABLE_CONCURRENCY_AUTOSAVE
+#ifdef DISABLE_CONCURRENCY_AUTOSAVE
if (vos_concurrent_sessions_running())
- {
+ {
/*
This timer routine is going to be called only when AP
persona is up.
If there are concurrent sessions running we do not want
to shut down the Bss.Instead we run the timer again so
that if Autosave is enabled next time and other session
- was down only then we bring down AP
+ was down only then we bring down AP
*/
pHostapdAdapter = netdev_priv(dev);
pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
vos_status = vos_timer_start(
- &pHddApCtx->hdd_ap_inactivity_timer,
+ &pHddApCtx->hdd_ap_inactivity_timer,
(WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->nAPAutoShutOff
* 1000);
if (!VOS_IS_STATUS_SUCCESS(vos_status))
@@ -358,7 +361,7 @@ void hdd_hostapd_inactivity_timer_cb(v_PVOID_t usrDataForCallback)
wrqu.data.length = event_len;
hddLog(LOG1, FL("Shutting down AP interface due to inactivity"));
- wireless_send_event(dev, IWEVCUSTOM, &wrqu, (char *)we_custom_event);
+ wireless_send_event(dev, IWEVCUSTOM, &wrqu, (char *)we_custom_event);
EXIT();
}
@@ -407,7 +410,7 @@ void hdd_clear_all_sta(hdd_adapter_t *pHostapdAdapter, v_PVOID_t usrDataForCallb
hddLog(LOGE, FL("Clearing all the STA entry....\n"));
for (staId = 0; staId < WLAN_MAX_STA_COUNT; staId++)
{
- if ( pHostapdAdapter->aStaInfo[staId].isUsed &&
+ if ( pHostapdAdapter->aStaInfo[staId].isUsed &&
( staId != (WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->uBCStaId))
{
//Disconnect all the stations
@@ -422,7 +425,7 @@ static int hdd_stop_p2p_link(hdd_adapter_t *pHostapdAdapter,v_PVOID_t usrDataFor
VOS_STATUS status = VOS_STATUS_SUCCESS;
dev = (struct net_device *)usrDataForCallback;
ENTER();
- if(test_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags))
+ if(test_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags))
{
if ( VOS_STATUS_SUCCESS == (status = WLANSAP_StopBss((WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext) ) )
{
@@ -446,7 +449,7 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
int we_event = 0;
int i = 0;
v_U8_t staId;
- VOS_STATUS vos_status;
+ VOS_STATUS vos_status;
v_BOOL_t bWPSState;
v_BOOL_t bApActive = FALSE;
v_BOOL_t bAuthRequired = TRUE;
@@ -454,7 +457,7 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
char unknownSTAEvent[IW_CUSTOM_MAX+1];
char maxAssocExceededEvent[IW_CUSTOM_MAX+1];
v_BYTE_t we_custom_start_event[64];
- char *startBssEvent;
+ char *startBssEvent;
hdd_context_t *pHddCtx;
hdd_scaninfo_t *pScanInfo = NULL;
struct iw_michaelmicfailure msg;
@@ -470,7 +473,7 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
return eHAL_STATUS_FAILURE;
}
- pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pHostapdAdapter);
+ pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pHostapdAdapter);
pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
sapEvent = pSapEvent->sapHddEventCode;
memset(&wrqu, '\0', sizeof(wrqu));
@@ -486,23 +489,28 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
pHostapdState->vosStatus = pSapEvent->sapevt.sapStartBssCompleteEvent.status;
vos_status = vos_event_set(&pHostapdState->vosEvent);
-
+
if (!VOS_IS_STATUS_SUCCESS(vos_status) || pHostapdState->vosStatus)
- {
+ {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: startbss event failed!!\n"));
goto stopbss;
}
else
- {
+ {
pHddApCtx->uBCStaId = pSapEvent->sapevt.sapStartBssCompleteEvent.staId;
//@@@ need wep logic here to set privacy bit
hdd_softap_Register_BC_STA(pHostapdAdapter, pHddApCtx->uPrivacy);
}
-
+#ifdef IPA_OFFLOAD
+ if (hdd_ipa_is_enabled(pHddCtx))
+ hdd_ipa_wlan_evt(pHostapdAdapter, WLAN_RX_SAP_SELF_STA_ID,
+ WLAN_AP_CONNECT, pHostapdAdapter->dev->dev_addr);
+#endif
+
if (0 != (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->nAPAutoShutOff)
{
// AP Inactivity timer init and start
- vos_status = vos_timer_init( &pHddApCtx->hdd_ap_inactivity_timer, VOS_TIMER_TYPE_SW,
+ vos_status = vos_timer_init( &pHddApCtx->hdd_ap_inactivity_timer, VOS_TIMER_TYPE_SW,
hdd_hostapd_inactivity_timer_cb, (v_PVOID_t)dev );
if (!VOS_IS_STATUS_SUCCESS(vos_status))
hddLog(LOGE, FL("Failed to init AP inactivity timer\n"));
@@ -521,18 +529,18 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
//Check if there is any group key pending to set.
if( pHddApCtx->groupKey.keyLength )
{
- if( VOS_STATUS_SUCCESS != WLANSAP_SetKeySta(
+ if( VOS_STATUS_SUCCESS != WLANSAP_SetKeySta(
(WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext,
&pHddApCtx->groupKey ) )
{
- VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s: WLANSAP_SetKeySta failed", __func__);
}
pHddApCtx->groupKey.keyLength = 0;
}
else
{
- for ( i = 0; i < CSR_MAX_NUM_KEY; i++ )
+ for ( i = 0; i < CSR_MAX_NUM_KEY; i++ )
{
if ( !pHddApCtx->wepKey[i].keyLength )
continue;
@@ -540,7 +548,7 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
if( VOS_STATUS_SUCCESS != WLANSAP_SetKeySta(
(WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext,
&pHddApCtx->wepKey[i] ) )
- {
+ {
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s: WLANSAP_SetKeySta failed idx %d", __func__, i);
}
@@ -556,20 +564,25 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
we_event = IWEVCUSTOM;
we_custom_event_generic = we_custom_start_event;
hdd_dump_concurrency_info(pHddCtx);
- break; //Event will be sent after Switch-Case stmt
+ break; //Event will be sent after Switch-Case stmt
case eSAP_STOP_BSS_EVENT:
- hddLog(LOG1, FL("BSS stop status = %s\n"),pSapEvent->sapevt.sapStopBssCompleteEvent.status ?
+ hddLog(LOG1, FL("BSS stop status = %s\n"),pSapEvent->sapevt.sapStopBssCompleteEvent.status ?
"eSAP_STATUS_FAILURE" : "eSAP_STATUS_SUCCESS");
//Free up Channel List incase if it is set
sapCleanupChannelList();
pHddApCtx->operatingChannel = 0; //Invalidate the channel info.
+#ifdef IPA_OFFLOAD
+ if (hdd_ipa_is_enabled(pHddCtx))
+ hdd_ipa_wlan_evt(pHostapdAdapter, WLAN_RX_SAP_SELF_STA_ID,
+ WLAN_AP_DISCONNECT, pHostapdAdapter->dev->dev_addr);
+#endif
goto stopbss;
case eSAP_STA_SET_KEY_EVENT:
//TODO: forward the message to hostapd once implementtation is done for now just print
- hddLog(LOG1, FL("SET Key: configured status = %s\n"),pSapEvent->sapevt.sapStationSetKeyCompleteEvent.status ?
+ hddLog(LOG1, FL("SET Key: configured status = %s\n"),pSapEvent->sapevt.sapStationSetKeyCompleteEvent.status ?
"eSAP_STATUS_FAILURE" : "eSAP_STATUS_SUCCESS");
return VOS_STATUS_SUCCESS;
case eSAP_STA_DEL_KEY_EVENT:
@@ -584,7 +597,7 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
hddLog(LOG1, "MIC MAC "MAC_ADDRESS_STR"\n", MAC_ADDR_ARRAY(msg.src_addr.sa_data));
if(pSapEvent->sapevt.sapStationMICFailureEvent.multicast == eSAP_TRUE)
msg.flags = IW_MICFAILURE_GROUP;
- else
+ else
msg.flags = IW_MICFAILURE_PAIRWISE;
memset(&wrqu, 0, sizeof(wrqu));
wrqu.data.length = sizeof(msg);
@@ -592,29 +605,29 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
we_custom_event_generic = (v_BYTE_t *)&msg;
}
/* inform mic failure to nl80211 */
- cfg80211_michael_mic_failure(dev,
+ cfg80211_michael_mic_failure(dev,
pSapEvent->sapevt.
sapStationMICFailureEvent.staMac.bytes,
- ((pSapEvent->sapevt.sapStationMICFailureEvent.multicast == eSAP_TRUE) ?
+ ((pSapEvent->sapevt.sapStationMICFailureEvent.multicast == eSAP_TRUE) ?
NL80211_KEYTYPE_GROUP :
NL80211_KEYTYPE_PAIRWISE),
- pSapEvent->sapevt.sapStationMICFailureEvent.keyId,
- pSapEvent->sapevt.sapStationMICFailureEvent.TSC,
+ pSapEvent->sapevt.sapStationMICFailureEvent.keyId,
+ pSapEvent->sapevt.sapStationMICFailureEvent.TSC,
GFP_KERNEL);
break;
-
+
case eSAP_STA_ASSOC_EVENT:
case eSAP_STA_REASSOC_EVENT:
wrqu.addr.sa_family = ARPHRD_ETHER;
- memcpy(wrqu.addr.sa_data, &pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.staMac,
+ memcpy(wrqu.addr.sa_data, &pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.staMac,
sizeof(v_MACADDR_t));
hddLog(LOG1, " associated "MAC_ADDRESS_STR"\n", MAC_ADDR_ARRAY(wrqu.addr.sa_data));
we_event = IWEVREGISTERED;
-
+
WLANSAP_Get_WPS_State((WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext, &bWPSState);
-
+
if ( (eCSR_ENCRYPT_TYPE_NONE == pHddApCtx->ucEncryptType) ||
- ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pHddApCtx->ucEncryptType ) ||
+ ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pHddApCtx->ucEncryptType ) ||
( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pHddApCtx->ucEncryptType ) )
{
bAuthRequired = FALSE;
@@ -642,6 +655,13 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
(v_MACADDR_t *)wrqu.addr.sa_data,
pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.wmmEnabled);
}
+#ifdef IPA_OFFLOAD
+ if (hdd_ipa_is_enabled(pHddCtx))
+ hdd_ipa_wlan_evt(pHostapdAdapter,
+ pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.staId,
+ WLAN_CLIENT_CONNECT_EX,
+ pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.staMac.bytes);
+#endif
// Stop AP inactivity timer
if (pHddApCtx->hdd_ap_inactivity_timer.state == VOS_TIMER_STATE_RUNNING)
@@ -704,6 +724,11 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, FL("ERROR: HDD Failed to find sta id!!"));
return VOS_STATUS_E_FAILURE;
}
+#ifdef IPA_OFFLOAD
+ if (hdd_ipa_is_enabled(pHddCtx))
+ hdd_ipa_wlan_evt(pHostapdAdapter, staId, WLAN_CLIENT_DISCONNECT,
+ pSapEvent->sapevt.sapStationDisassocCompleteEvent.staMac.bytes);
+#endif
hdd_softap_DeregisterSTA(pHostapdAdapter, staId);
if (0 != (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->nAPAutoShutOff)
@@ -744,19 +769,19 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
{
static const char * message ="MLMEWPSPBCPROBEREQ.indication";
union iwreq_data wreq;
-
+
down(&pHddApCtx->semWpsPBCOverlapInd);
pHddApCtx->WPSPBCProbeReq.probeReqIELen = pSapEvent->sapevt.sapPBCProbeReqEvent.WPSPBCProbeReq.probeReqIELen;
-
- vos_mem_copy(pHddApCtx->WPSPBCProbeReq.probeReqIE, pSapEvent->sapevt.sapPBCProbeReqEvent.WPSPBCProbeReq.probeReqIE,
+
+ vos_mem_copy(pHddApCtx->WPSPBCProbeReq.probeReqIE, pSapEvent->sapevt.sapPBCProbeReqEvent.WPSPBCProbeReq.probeReqIE,
pHddApCtx->WPSPBCProbeReq.probeReqIELen);
-
+
vos_mem_copy(pHddApCtx->WPSPBCProbeReq.peerMacAddr, pSapEvent->sapevt.sapPBCProbeReqEvent.WPSPBCProbeReq.peerMacAddr, sizeof(v_MACADDR_t));
hddLog(LOG1, "WPS PBC probe req "MAC_ADDRESS_STR"\n", MAC_ADDR_ARRAY(pHddApCtx->WPSPBCProbeReq.peerMacAddr));
memset(&wreq, 0, sizeof(wreq));
wreq.data.length = strlen(message); // This is length of message
- wireless_send_event(dev, IWEVCUSTOM, &wreq, (char *)message);
-
+ wireless_send_event(dev, IWEVCUSTOM, &wreq, (char *)message);
+
return VOS_STATUS_SUCCESS;
}
case eSAP_ASSOC_STA_CALLBACK_EVENT:
@@ -770,25 +795,25 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
pAssocStasArray->assocId,
pAssocStasArray->staId,
MAC_ADDR_ARRAY(pAssocStasArray->staMac.bytes));
- pAssocStasArray++;
+ pAssocStasArray++;
}
}
vos_mem_free(pSapEvent->sapevt.sapAssocStaListEvent.pAssocStas);// Release caller allocated memory here
return VOS_STATUS_SUCCESS;
case eSAP_INDICATE_MGMT_FRAME:
- hdd_indicateMgmtFrame( pHostapdAdapter,
+ hdd_indicateMgmtFrame( pHostapdAdapter,
pSapEvent->sapevt.sapManagementFrameInfo.nFrameLength,
pSapEvent->sapevt.sapManagementFrameInfo.pbFrames,
- pSapEvent->sapevt.sapManagementFrameInfo.frameType,
+ pSapEvent->sapevt.sapManagementFrameInfo.frameType,
pSapEvent->sapevt.sapManagementFrameInfo.rxChan, 0);
return VOS_STATUS_SUCCESS;
case eSAP_REMAIN_CHAN_READY:
hdd_remainChanReadyHandler( pHostapdAdapter );
return VOS_STATUS_SUCCESS;
case eSAP_SEND_ACTION_CNF:
- hdd_sendActionCnf( pHostapdAdapter,
- ( eSAP_STATUS_SUCCESS ==
- pSapEvent->sapevt.sapActionCnf.actionSendSuccess ) ?
+ hdd_sendActionCnf( pHostapdAdapter,
+ ( eSAP_STATUS_SUCCESS ==
+ pSapEvent->sapevt.sapActionCnf.actionSendSuccess ) ?
TRUE : FALSE );
return VOS_STATUS_SUCCESS;
case eSAP_UNKNOWN_STA_JOIN:
@@ -895,106 +920,106 @@ stopbss :
}
return VOS_STATUS_SUCCESS;
}
-int hdd_softap_unpackIE(
+int hdd_softap_unpackIE(
tHalHandle halHandle,
- eCsrEncryptionType *pEncryptType,
- eCsrEncryptionType *mcEncryptType,
- eCsrAuthType *pAuthType,
- u_int16_t gen_ie_len,
+ eCsrEncryptionType *pEncryptType,
+ eCsrEncryptionType *mcEncryptType,
+ eCsrAuthType *pAuthType,
+ u_int16_t gen_ie_len,
u_int8_t *gen_ie )
{
- tDot11fIERSN dot11RSNIE;
- tDot11fIEWPA dot11WPAIE;
-
- tANI_U8 *pRsnIe;
+ tDot11fIERSN dot11RSNIE;
+ tDot11fIEWPA dot11WPAIE;
+
+ tANI_U8 *pRsnIe;
tANI_U16 RSNIeLen;
-
+
if (NULL == halHandle)
{
hddLog(LOGE, FL("Error haHandle returned NULL\n"));
return -EINVAL;
}
-
+
// Validity checks
- if ((gen_ie_len < VOS_MIN(DOT11F_IE_RSN_MIN_LEN, DOT11F_IE_WPA_MIN_LEN)) ||
- (gen_ie_len > VOS_MAX(DOT11F_IE_RSN_MAX_LEN, DOT11F_IE_WPA_MAX_LEN)) )
+ if ((gen_ie_len < VOS_MIN(DOT11F_IE_RSN_MIN_LEN, DOT11F_IE_WPA_MIN_LEN)) ||
+ (gen_ie_len > VOS_MAX(DOT11F_IE_RSN_MAX_LEN, DOT11F_IE_WPA_MAX_LEN)) )
return -EINVAL;
// Type check
- if ( gen_ie[0] == DOT11F_EID_RSN)
- {
+ if ( gen_ie[0] == DOT11F_EID_RSN)
+ {
// Validity checks
- if ((gen_ie_len < DOT11F_IE_RSN_MIN_LEN ) ||
+ if ((gen_ie_len < DOT11F_IE_RSN_MIN_LEN ) ||
(gen_ie_len > DOT11F_IE_RSN_MAX_LEN) )
{
return VOS_STATUS_E_FAILURE;
}
- // Skip past the EID byte and length byte
- pRsnIe = gen_ie + 2;
- RSNIeLen = gen_ie_len - 2;
+ // Skip past the EID byte and length byte
+ pRsnIe = gen_ie + 2;
+ RSNIeLen = gen_ie_len - 2;
// Unpack the RSN IE
memset(&dot11RSNIE, 0, sizeof(tDot11fIERSN));
- dot11fUnpackIeRSN((tpAniSirGlobal) halHandle,
- pRsnIe,
- RSNIeLen,
+ dot11fUnpackIeRSN((tpAniSirGlobal) halHandle,
+ pRsnIe,
+ RSNIeLen,
&dot11RSNIE);
- // Copy out the encryption and authentication types
- hddLog(LOG1, FL("%s: pairwise cipher suite count: %d\n"),
+ // Copy out the encryption and authentication types
+ hddLog(LOG1, FL("%s: pairwise cipher suite count: %d\n"),
__func__, dot11RSNIE.pwise_cipher_suite_count );
- hddLog(LOG1, FL("%s: authentication suite count: %d\n"),
+ hddLog(LOG1, FL("%s: authentication suite count: %d\n"),
__func__, dot11RSNIE.akm_suite_count);
- /*Here we have followed the apple base code,
+ /*Here we have followed the apple base code,
but probably I suspect we can do something different*/
//dot11RSNIE.akm_suite_count
- // Just translate the FIRST one
- *pAuthType = hdd_TranslateRSNToCsrAuthType(dot11RSNIE.akm_suites[0]);
- //dot11RSNIE.pwise_cipher_suite_count
- *pEncryptType = hdd_TranslateRSNToCsrEncryptionType(dot11RSNIE.pwise_cipher_suites[0]);
- //dot11RSNIE.gp_cipher_suite_count
- *mcEncryptType = hdd_TranslateRSNToCsrEncryptionType(dot11RSNIE.gp_cipher_suite);
+ // Just translate the FIRST one
+ *pAuthType = hdd_TranslateRSNToCsrAuthType(dot11RSNIE.akm_suites[0]);
+ //dot11RSNIE.pwise_cipher_suite_count
+ *pEncryptType = hdd_TranslateRSNToCsrEncryptionType(dot11RSNIE.pwise_cipher_suites[0]);
+ //dot11RSNIE.gp_cipher_suite_count
+ *mcEncryptType = hdd_TranslateRSNToCsrEncryptionType(dot11RSNIE.gp_cipher_suite);
// Set the PMKSA ID Cache for this interface
-
+
// Calling csrRoamSetPMKIDCache to configure the PMKIDs into the cache
- } else
- if (gen_ie[0] == DOT11F_EID_WPA)
- {
+ } else
+ if (gen_ie[0] == DOT11F_EID_WPA)
+ {
// Validity checks
- if ((gen_ie_len < DOT11F_IE_WPA_MIN_LEN ) ||
+ if ((gen_ie_len < DOT11F_IE_WPA_MIN_LEN ) ||
(gen_ie_len > DOT11F_IE_WPA_MAX_LEN))
{
return VOS_STATUS_E_FAILURE;
}
- // Skip past the EID byte and length byte - and four byte WiFi OUI
- pRsnIe = gen_ie + 2 + 4;
- RSNIeLen = gen_ie_len - (2 + 4);
+ // Skip past the EID byte and length byte - and four byte WiFi OUI
+ pRsnIe = gen_ie + 2 + 4;
+ RSNIeLen = gen_ie_len - (2 + 4);
// Unpack the WPA IE
memset(&dot11WPAIE, 0, sizeof(tDot11fIEWPA));
- dot11fUnpackIeWPA((tpAniSirGlobal) halHandle,
- pRsnIe,
- RSNIeLen,
+ dot11fUnpackIeWPA((tpAniSirGlobal) halHandle,
+ pRsnIe,
+ RSNIeLen,
&dot11WPAIE);
- // Copy out the encryption and authentication types
- hddLog(LOG1, FL("%s: WPA unicast cipher suite count: %d\n"),
+ // Copy out the encryption and authentication types
+ hddLog(LOG1, FL("%s: WPA unicast cipher suite count: %d\n"),
__func__, dot11WPAIE.unicast_cipher_count );
- hddLog(LOG1, FL("%s: WPA authentication suite count: %d\n"),
+ hddLog(LOG1, FL("%s: WPA authentication suite count: %d\n"),
__func__, dot11WPAIE.auth_suite_count);
//dot11WPAIE.auth_suite_count
- // Just translate the FIRST one
- *pAuthType = hdd_TranslateWPAToCsrAuthType(dot11WPAIE.auth_suites[0]);
- //dot11WPAIE.unicast_cipher_count
- *pEncryptType = hdd_TranslateWPAToCsrEncryptionType(dot11WPAIE.unicast_ciphers[0]);
- //dot11WPAIE.unicast_cipher_count
- *mcEncryptType = hdd_TranslateWPAToCsrEncryptionType(dot11WPAIE.multicast_cipher);
- }
- else
- {
+ // Just translate the FIRST one
+ *pAuthType = hdd_TranslateWPAToCsrAuthType(dot11WPAIE.auth_suites[0]);
+ //dot11WPAIE.unicast_cipher_count
+ *pEncryptType = hdd_TranslateWPAToCsrEncryptionType(dot11WPAIE.unicast_ciphers[0]);
+ //dot11WPAIE.unicast_cipher_count
+ *mcEncryptType = hdd_TranslateWPAToCsrEncryptionType(dot11WPAIE.multicast_cipher);
+ }
+ else
+ {
hddLog(LOGW, FL("%s: gen_ie[0]: %d\n"), __func__, gen_ie[0]);
- return VOS_STATUS_E_FAILURE;
+ return VOS_STATUS_E_FAILURE;
}
return VOS_STATUS_SUCCESS;
}
int
-static iw_softap_setparam(struct net_device *dev,
+static iw_softap_setparam(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
@@ -1005,7 +1030,7 @@ static iw_softap_setparam(struct net_device *dev,
int set_value = value[1];
eHalStatus status;
int ret = 0; /* success */
- v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
+ v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
switch(sub_cmd)
{
@@ -1013,12 +1038,12 @@ static iw_softap_setparam(struct net_device *dev,
case QCSAP_PARAM_CLR_ACL:
if ( VOS_STATUS_SUCCESS != WLANSAP_ClearACL( pVosContext ))
{
- ret = -EIO;
+ ret = -EIO;
}
break;
case QCSAP_PARAM_ACL_MODE:
- if ((eSAP_ALLOW_ALL < (eSapMacAddrACL)set_value) ||
+ if ((eSAP_ALLOW_ALL < (eSapMacAddrACL)set_value) ||
(eSAP_ACCEPT_UNLESS_DENIED > (eSapMacAddrACL)set_value))
{
hddLog(LOGE, FL("Invalid ACL Mode value %d"), set_value);
@@ -1046,7 +1071,7 @@ static iw_softap_setparam(struct net_device *dev,
}
status = ccmCfgSetInt(hHal, WNI_CFG_ASSOC_STA_LIMIT,
set_value, NULL, eANI_BOOLEAN_FALSE);
- if ( status != eHAL_STATUS_SUCCESS )
+ if ( status != eHAL_STATUS_SUCCESS )
{
hddLog(LOGE, FL("setMaxAssoc failure, status %d"),
status);
@@ -1288,7 +1313,7 @@ static iw_softap_setparam(struct net_device *dev,
int
-static iw_softap_getparam(struct net_device *dev,
+static iw_softap_getparam(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
@@ -1298,7 +1323,7 @@ static iw_softap_getparam(struct net_device *dev,
int sub_cmd = value[0];
eHalStatus status;
int ret = 0; /* success */
- v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
+ v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
switch (sub_cmd)
{
@@ -1309,25 +1334,25 @@ static iw_softap_getparam(struct net_device *dev,
ret = -EIO;
}
break;
-
+
case QCSAP_PARAM_CLR_ACL:
if ( VOS_STATUS_SUCCESS != WLANSAP_ClearACL( pVosContext ))
{
- ret = -EIO;
- }
+ ret = -EIO;
+ }
*value = 0;
break;
-
+
case QCSAP_PARAM_MODULE_DOWN_IND:
{
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"%s: sending WLAN_MODULE_DOWN_IND", __func__);
send_btc_nlink_msg(WLAN_MODULE_DOWN_IND, 0);
-#ifdef WLAN_BTAMP_FEATURE
+#ifdef WLAN_BTAMP_FEATURE
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"%s: Take down AMP PAL", __func__);
BSL_Deinit(vos_get_global_context(VOS_MODULE_ID_HDD, NULL));
-#endif
+#endif
*value = 0;
break;
}
@@ -1366,7 +1391,7 @@ static iw_softap_getparam(struct net_device *dev,
/* Usage:
BLACK_LIST = 0
- WHITE_LIST = 1
+ WHITE_LIST = 1
ADD MAC = 0
REMOVE MAC = 1
@@ -1375,7 +1400,7 @@ static iw_softap_getparam(struct net_device *dev,
while using this ioctl
Syntax:
- iwpriv softap.0 modify_acl
+ iwpriv softap.0 modify_acl
<6 octet mac addr> <list type> <cmd type>
Examples:
@@ -1388,7 +1413,7 @@ int iw_softap_modify_acl(struct net_device *dev, struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
- v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
+ v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
v_BYTE_t *value = (v_BYTE_t*)extra;
v_U8_t pPeerStaMac[VOS_MAC_ADDR_SIZE];
int listType, cmd, i;
@@ -1404,7 +1429,7 @@ int iw_softap_modify_acl(struct net_device *dev, struct iw_request_info *info,
cmd = (int)(*(value+i));
hddLog(LOG1, "%s: SAP Modify ACL arg0 %02x:%02x:%02x:%02x:%02x:%02x arg1 %d arg2 %d\n",
- __func__, pPeerStaMac[0], pPeerStaMac[1], pPeerStaMac[2],
+ __func__, pPeerStaMac[0], pPeerStaMac[1], pPeerStaMac[2],
pPeerStaMac[3], pPeerStaMac[4], pPeerStaMac[5], listType, cmd);
if (WLANSAP_ModifyACL(pVosContext, pPeerStaMac,(eSapACLType)listType,(eSapACLCmdType)cmd)
@@ -1606,7 +1631,7 @@ static iw_softap_getassoc_stamacaddr(struct net_device *dev,
spin_lock_bh( &pHostapdAdapter->staInfo_lock );
while((cnt < WLAN_MAX_STA_COUNT) && (len > (sizeof(v_MACADDR_t)+1))) {
if (TRUE == pStaInfo[cnt].isUsed) {
-
+
if(!IS_BROADCAST_MAC(pStaInfo[cnt].macAddrSTA.bytes)) {
if (copy_to_user((void *)wrqu->data.pointer + maclist_index,
(void *)&(pStaInfo[cnt].macAddrSTA), sizeof(v_MACADDR_t)))
@@ -1619,7 +1644,7 @@ static iw_softap_getassoc_stamacaddr(struct net_device *dev,
}
}
cnt++;
- }
+ }
spin_unlock_bh( &pHostapdAdapter->staInfo_lock );
if (copy_to_user((void *)wrqu->data.pointer + maclist_index,
@@ -1656,8 +1681,8 @@ static iw_softap_disassoc_sta(struct net_device *dev,
union iwreq_data *wrqu, char *extra)
{
hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
- v_U8_t *peerMacAddr;
-
+ v_U8_t *peerMacAddr;
+
ENTER();
/* iwpriv tool or framework calls this ioctl with
* data passed in extra (less than 16 octets);
@@ -1723,7 +1748,7 @@ static iw_softap_commit(struct net_device *dev,
VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
hdd_hostapd_state_t *pHostapdState;
- v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
+ v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
tpWLAN_SAPEventCB pSapEventCallback;
tsap_Config_t *pConfig;
s_CommitConfig_t *pCommitConfig;
@@ -1736,7 +1761,7 @@ static iw_softap_commit(struct net_device *dev,
pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pHostapdAdapter);
pCommitConfig = (s_CommitConfig_t *)extra;
-
+
pConfig = kmalloc(sizeof(tsap_Config_t), GFP_KERNEL);
if(NULL == pConfig) {
hddLog(LOG1, "VOS unable to allocate memory\n");
@@ -1751,15 +1776,15 @@ static iw_softap_commit(struct net_device *dev,
switch(pCommitConfig->hw_mode )
{
case eQC_DOT11_MODE_11A:
- pConfig->SapHw_mode = eSAP_DOT11_MODE_11a;
+ pConfig->SapHw_mode = eSAP_DOT11_MODE_11a;
break;
case eQC_DOT11_MODE_11B:
- pConfig->SapHw_mode = eSAP_DOT11_MODE_11b;
+ pConfig->SapHw_mode = eSAP_DOT11_MODE_11b;
break;
case eQC_DOT11_MODE_11G:
pConfig->SapHw_mode = eSAP_DOT11_MODE_11g;
break;
-
+
case eQC_DOT11_MODE_11N:
pConfig->SapHw_mode = eSAP_DOT11_MODE_11n;
break;
@@ -1772,45 +1797,45 @@ static iw_softap_commit(struct net_device *dev,
default:
pConfig->SapHw_mode = eSAP_DOT11_MODE_11n;
break;
-
+
}
-
+
pConfig->ieee80211d = pCommitConfig->qcsap80211d;
vos_mem_copy(pConfig->countryCode, pCommitConfig->countryCode, 3);
if(pCommitConfig->authType == eQC_AUTH_TYPE_SHARED_KEY)
pConfig->authType = eSAP_SHARED_KEY;
- else if(pCommitConfig->authType == eQC_AUTH_TYPE_OPEN_SYSTEM)
+ else if(pCommitConfig->authType == eQC_AUTH_TYPE_OPEN_SYSTEM)
pConfig->authType = eSAP_OPEN_SYSTEM;
else
pConfig->authType = eSAP_AUTO_SWITCH;
-
+
pConfig->privacy = pCommitConfig->privacy;
(WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->uPrivacy = pCommitConfig->privacy;
pConfig->wps_state = pCommitConfig->wps_state;
- pConfig->fwdWPSPBCProbeReq = 1; // Forward WPS PBC probe request frame up
+ pConfig->fwdWPSPBCProbeReq = 1; // Forward WPS PBC probe request frame up
pConfig->RSNWPAReqIELength = pCommitConfig->RSNWPAReqIELength;
if(pConfig->RSNWPAReqIELength){
pConfig->pRSNWPAReqIE = &pCommitConfig->RSNWPAReqIE[0];
if ((pConfig->pRSNWPAReqIE[0] == DOT11F_EID_RSN) || (pConfig->pRSNWPAReqIE[0] == DOT11F_EID_WPA)){
// The actual processing may eventually be more extensive than this.
// Right now, just consume any PMKIDs that are sent in by the app.
- status = hdd_softap_unpackIE(
+ status = hdd_softap_unpackIE(
vos_get_context( VOS_MODULE_ID_PE, pVosContext),
&RSNEncryptType,
&mcRSNEncryptType,
&RSNAuthType,
pConfig->pRSNWPAReqIE[1]+2,
pConfig->pRSNWPAReqIE );
-
+
if( VOS_STATUS_SUCCESS == status )
{
// Now copy over all the security attributes you have parsed out
- //TODO: Need to handle mixed mode
+ //TODO: Need to handle mixed mode
pConfig->RSNEncryptType = RSNEncryptType; // Use the cipher type in the RSN IE
pConfig->mcRSNEncryptType = mcRSNEncryptType;
hddLog( LOG1, FL("CSR AuthType = %d, EncryptionType = %d mcEncryptionType = %d\n"),
RSNAuthType, RSNEncryptType, mcRSNEncryptType);
- }
+ }
}
}
else
@@ -1818,7 +1843,7 @@ static iw_softap_commit(struct net_device *dev,
/* If no RSNIE, set encrypt type to NONE*/
pConfig->RSNEncryptType = eCSR_ENCRYPT_TYPE_NONE;
pConfig->mcRSNEncryptType = eCSR_ENCRYPT_TYPE_NONE;
- hddLog( LOG1, FL("EncryptionType = %d mcEncryptionType = %d\n"),
+ hddLog( LOG1, FL("EncryptionType = %d mcEncryptionType = %d\n"),
pConfig->RSNEncryptType, pConfig->mcRSNEncryptType);
}
@@ -1828,11 +1853,11 @@ static iw_softap_commit(struct net_device *dev,
return -EIO;
}
- pConfig->SSIDinfo.ssidHidden = pCommitConfig->SSIDinfo.ssidHidden;
+ pConfig->SSIDinfo.ssidHidden = pCommitConfig->SSIDinfo.ssidHidden;
pConfig->SSIDinfo.ssid.length = pCommitConfig->SSIDinfo.ssid.length;
vos_mem_copy(pConfig->SSIDinfo.ssid.ssId, pCommitConfig->SSIDinfo.ssid.ssId, pConfig->SSIDinfo.ssid.length);
vos_mem_copy(pConfig->self_macaddr.bytes, pHostapdAdapter->macAddressCurrent.bytes, sizeof(v_MACADDR_t));
-
+
pConfig->SapMacaddr_acl = pCommitConfig->qc_macaddr_acl;
// ht_capab is not what the name conveys,this is used for protection bitmap
@@ -1861,37 +1886,37 @@ static iw_softap_commit(struct net_device *dev,
//Uapsd Enabled Bit
pConfig->UapsdEnable = (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apUapsdEnabled;
//Enable OBSS protection
- pConfig->obssProtEnabled = (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apOBSSProtEnabled;
+ pConfig->obssProtEnabled = (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apOBSSProtEnabled;
(WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->apDisableIntraBssFwd = (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apDisableIntraBssFwd;
-
+
hddLog(LOGW, FL("SOftAP macaddress : "MAC_ADDRESS_STR"\n"), MAC_ADDR_ARRAY(pHostapdAdapter->macAddressCurrent.bytes));
- hddLog(LOGW,FL("ssid =%s\n"), pConfig->SSIDinfo.ssid.ssId);
+ hddLog(LOGW,FL("ssid =%s\n"), pConfig->SSIDinfo.ssid.ssId);
hddLog(LOGW,FL("beaconint=%d, channel=%d\n"), (int)pConfig->beacon_int, (int)pConfig->channel);
hddLog(LOGW,FL("hw_mode=%x\n"), pConfig->SapHw_mode);
- hddLog(LOGW,FL("privacy=%d, authType=%d\n"), pConfig->privacy, pConfig->authType);
+ hddLog(LOGW,FL("privacy=%d, authType=%d\n"), pConfig->privacy, pConfig->authType);
hddLog(LOGW,FL("RSN/WPALen=%d, \n"),(int)pConfig->RSNWPAReqIELength);
- hddLog(LOGW,FL("Uapsd = %d\n"),pConfig->UapsdEnable);
- hddLog(LOGW,FL("ProtEnabled = %d, OBSSProtEnabled = %d\n"),pConfig->protEnabled, pConfig->obssProtEnabled);
- hddLog(LOGW,FL("DisableIntraBssFwd = %d\n"),(WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->apDisableIntraBssFwd);
-
+ hddLog(LOGW,FL("Uapsd = %d\n"),pConfig->UapsdEnable);
+ hddLog(LOGW,FL("ProtEnabled = %d, OBSSProtEnabled = %d\n"),pConfig->protEnabled, pConfig->obssProtEnabled);
+ hddLog(LOGW,FL("DisableIntraBssFwd = %d\n"),(WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->apDisableIntraBssFwd);
+
pSapEventCallback = hdd_hostapd_SAPEventCB;
pConfig->persona = pHostapdAdapter->device_mode;
if(WLANSAP_StartBss(pVosContext, pSapEventCallback, pConfig,(v_PVOID_t)dev) != VOS_STATUS_SUCCESS)
{
hddLog(LOGE,FL("SAP Start Bss fail\n"));
}
-
+
kfree(pConfig);
-
+
hddLog(LOG1, FL("Waiting for Scan to complete(auto mode) and BSS to start"));
vos_status = vos_wait_single_event(&pHostapdState->vosEvent, 10000);
-
+
if (!VOS_IS_STATUS_SUCCESS(vos_status))
- {
+ {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: HDD vos wait for single_event failed!!\n"));
VOS_ASSERT(0);
}
-
+
pHostapdState->bCommit = TRUE;
if(pHostapdState->vosStatus)
{
@@ -1900,11 +1925,11 @@ static iw_softap_commit(struct net_device *dev,
else
{
set_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
- WLANSAP_Update_WpsIe ( pVosContext );
+ WLANSAP_Update_WpsIe ( pVosContext );
return 0;
}
}
-static
+static
int iw_softap_setmlme(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
@@ -1942,7 +1967,7 @@ int iw_softap_setmlme(struct net_device *dev,
return 0;
}
-static int iw_softap_set_channel_range(struct net_device *dev,
+static int iw_softap_set_channel_range(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
@@ -1960,7 +1985,7 @@ static int iw_softap_set_channel_range(struct net_device *dev,
status = WLANSAP_SetChannelRange(hHal,startChannel,endChannel,band);
if(status != VOS_STATUS_SUCCESS)
{
- hddLog( LOGE, FL("iw_softap_set_channel_range: startChannel = %d, endChannel = %d band = %d\n"),
+ hddLog( LOGE, FL("iw_softap_set_channel_range: startChannel = %d, endChannel = %d band = %d\n"),
startChannel,endChannel, band);
ret = -EINVAL;
}
@@ -1970,7 +1995,7 @@ static int iw_softap_set_channel_range(struct net_device *dev,
return ret;
}
-int iw_softap_get_channel_list(struct net_device *dev,
+int iw_softap_get_channel_list(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
@@ -2012,7 +2037,7 @@ int iw_softap_get_channel_list(struct net_device *dev,
{
if( NV_CHANNEL_ENABLE == regChannels[i].enabled )
{
- channel_list->channels[num_channels] = rfChannels[i].channelNum;
+ channel_list->channels[num_channels] = rfChannels[i].channelNum;
num_channels++;
}
}
@@ -2031,21 +2056,21 @@ int iw_softap_get_channel_list(struct net_device *dev,
{
for(i = 0; i < temp_num_channels; i++)
{
-
- if((channel_list->channels[i] > 35) &&
+
+ if((channel_list->channels[i] > 35) &&
(channel_list->channels[i] < 49))
{
- vos_mem_move(&channel_list->channels[i],
- &channel_list->channels[i+1],
+ vos_mem_move(&channel_list->channels[i],
+ &channel_list->channels[i+1],
temp_num_channels - (i-1));
num_channels--;
temp_num_channels--;
i--;
- }
+ }
}
}
- hddLog(LOG1,FL(" number of channels %d\n"), num_channels);
+ hddLog(LOG1,FL(" number of channels %d\n"), num_channels);
if (num_channels > IW_MAX_FREQUENCIES)
{
@@ -2058,20 +2083,20 @@ int iw_softap_get_channel_list(struct net_device *dev,
return 0;
}
-static
+static
int iw_get_genie(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
- v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
+ v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
eHalStatus status;
v_U32_t length = DOT11F_IE_RSN_MAX_LEN;
v_U8_t genIeBytes[DOT11F_IE_RSN_MAX_LEN];
ENTER();
hddLog(LOG1,FL("getGEN_IE ioctl\n"));
// Actually retrieve the RSN IE from CSR. (We previously sent it down in the CSR Roam Profile.)
- status = WLANSap_getstationIE_information(pVosContext,
+ status = WLANSap_getstationIE_information(pVosContext,
&length,
genIeBytes);
length = VOS_MIN((u_int16_t) length, DOT11F_IE_RSN_MAX_LEN);
@@ -2084,22 +2109,22 @@ int iw_get_genie(struct net_device *dev,
}
wrqu->data.length = length;
- hddLog(LOG1,FL(" RSN IE of %d bytes returned\n"), wrqu->data.length );
-
-
+ hddLog(LOG1,FL(" RSN IE of %d bytes returned\n"), wrqu->data.length );
+
+
EXIT();
return 0;
}
-static
+static
int iw_get_WPSPBCProbeReqIEs(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
- hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
+ hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
sQcSapreq_WPSPBCProbeReqIES_t WPSPBCProbeReqIEs;
hdd_ap_ctx_t *pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
ENTER();
-
+
hddLog(LOG1,FL("get_WPSPBCProbeReqIEs ioctl\n"));
memset((void*)&WPSPBCProbeReqIEs, 0, sizeof(WPSPBCProbeReqIEs));
@@ -2126,22 +2151,22 @@ int iw_get_WPSPBCProbeReqIEs(struct net_device *dev,
}
/**---------------------------------------------------------------------------
-
- \brief iw_set_auth_hostap() -
+
+ \brief iw_set_auth_hostap() -
This function sets the auth type received from the wpa_supplicant.
-
+
\param - dev - Pointer to the net device.
- info - Pointer to the iw_request_info.
- wrqu - Pointer to the iwreq_data.
- - extra - Pointer to the data.
+ - extra - Pointer to the data.
\return - 0 for success, non zero for failure
-
+
--------------------------------------------------------------------------*/
int iw_set_auth_hostap(struct net_device *dev,struct iw_request_info *info,
union iwreq_data *wrqu,char *extra)
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
- hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
+ hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
ENTER();
switch(wrqu->param.flags & IW_AUTH_INDEX)
@@ -2152,8 +2177,8 @@ int iw_set_auth_hostap(struct net_device *dev,struct iw_request_info *info,
hddLog(VOS_TRACE_LEVEL_INFO_HIGH,
"Counter Measure started %d", wrqu->param.value);
pWextState->mTKIPCounterMeasures = TKIP_COUNTER_MEASURE_STARTED;
- }
- else {
+ }
+ else {
hddLog(VOS_TRACE_LEVEL_INFO_HIGH,
"Counter Measure stopped=%d", wrqu->param.value);
pWextState->mTKIPCounterMeasures = TKIP_COUNTER_MEASURE_STOPED;
@@ -2161,26 +2186,26 @@ int iw_set_auth_hostap(struct net_device *dev,struct iw_request_info *info,
hdd_softap_tkip_mic_fail_counter_measure(pAdapter,
wrqu->param.value);
- }
+ }
break;
-
+
default:
-
- hddLog(LOGW, "%s called with unsupported auth type %d", __func__,
+
+ hddLog(LOGW, "%s called with unsupported auth type %d", __func__,
wrqu->param.flags & IW_AUTH_INDEX);
break;
}
-
+
EXIT();
return 0;
}
-static int iw_set_ap_encodeext(struct net_device *dev,
+static int iw_set_ap_encodeext(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
{
hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
- v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
+ v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
hdd_ap_ctx_t *pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
int retval = 0;
VOS_STATUS vstatus;
@@ -2188,26 +2213,26 @@ static int iw_set_ap_encodeext(struct net_device *dev,
v_U8_t groupmacaddr[WNI_CFG_BSSID_LEN] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
int key_index;
struct iw_point *encoding = &wrqu->encoding;
- tCsrRoamSetKey setKey;
+ tCsrRoamSetKey setKey;
// tCsrRoamRemoveKey RemoveKey;
int i;
- ENTER();
-
+ ENTER();
+
key_index = encoding->flags & IW_ENCODE_INDEX;
-
+
if(key_index > 0) {
-
+
/*Convert from 1-based to 0-based keying*/
key_index--;
}
if(!ext->key_len) {
-#if 0
+#if 0
/*Set the encrytion type to NONE*/
#if 0
pRoamProfile->EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
#endif
-
+
RemoveKey.keyId = key_index;
if(ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
/*Key direction for group is RX only*/
@@ -2250,23 +2275,23 @@ static int iw_set_ap_encodeext(struct net_device *dev,
return retval;
}
-
+
vos_mem_zero(&setKey,sizeof(tCsrRoamSetKey));
-
+
setKey.keyId = key_index;
setKey.keyLength = ext->key_len;
-
+
if(ext->key_len <= CSR_MAX_KEY_LEN) {
vos_mem_copy(&setKey.Key[0],ext->key,ext->key_len);
- }
-
+ }
+
if(ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
/*Key direction for group is RX only*/
setKey.keyDirection = eSIR_RX_ONLY;
vos_mem_copy(setKey.peerMac,groupmacaddr,WNI_CFG_BSSID_LEN);
}
- else {
-
+ else {
+
setKey.keyDirection = eSIR_TX_RX;
vos_mem_copy(setKey.peerMac,ext->addr.sa_data,WNI_CFG_BSSID_LEN);
}
@@ -2275,72 +2300,72 @@ static int iw_set_ap_encodeext(struct net_device *dev,
setKey.keyDirection = eSIR_TX_DEFAULT;
vos_mem_copy(setKey.peerMac,ext->addr.sa_data,WNI_CFG_BSSID_LEN);
}
-
+
/*For supplicant pae role is zero*/
setKey.paeRole = 0;
-
+
switch(ext->alg)
- {
- case IW_ENCODE_ALG_NONE:
+ {
+ case IW_ENCODE_ALG_NONE:
setKey.encType = eCSR_ENCRYPT_TYPE_NONE;
break;
-
+
case IW_ENCODE_ALG_WEP:
setKey.encType = (ext->key_len== 5) ? eCSR_ENCRYPT_TYPE_WEP40:eCSR_ENCRYPT_TYPE_WEP104;
pHddApCtx->uPrivacy = 1;
hddLog(LOG1, "(%s) uPrivacy=%d", __func__, pHddApCtx->uPrivacy);
break;
-
+
case IW_ENCODE_ALG_TKIP:
{
v_U8_t *pKey = &setKey.Key[0];
-
+
setKey.encType = eCSR_ENCRYPT_TYPE_TKIP;
-
+
vos_mem_zero(pKey, CSR_MAX_KEY_LEN);
-
- /*Supplicant sends the 32bytes key in this order
-
+
+ /*Supplicant sends the 32bytes key in this order
+
|--------------|----------|----------|
- | Tk1 |TX-MIC | RX Mic |
+ | Tk1 |TX-MIC | RX Mic |
|--------------|----------|----------|
<---16bytes---><--8bytes--><--8bytes-->
-
+
*/
/*Sme expects the 32 bytes key to be in the below order
-
+
|--------------|----------|----------|
- | Tk1 |RX-MIC | TX Mic |
+ | Tk1 |RX-MIC | TX Mic |
|--------------|----------|----------|
<---16bytes---><--8bytes--><--8bytes-->
*/
/* Copy the Temporal Key 1 (TK1) */
vos_mem_copy(pKey,ext->key,16);
-
+
/*Copy the rx mic first*/
- vos_mem_copy(&pKey[16],&ext->key[24],8);
-
+ vos_mem_copy(&pKey[16],&ext->key[24],8);
+
/*Copy the tx mic */
- vos_mem_copy(&pKey[24],&ext->key[16],8);
-
- }
+ vos_mem_copy(&pKey[24],&ext->key[16],8);
+
+ }
break;
-
+
case IW_ENCODE_ALG_CCMP:
setKey.encType = eCSR_ENCRYPT_TYPE_AES;
break;
-
+
default:
setKey.encType = eCSR_ENCRYPT_TYPE_NONE;
break;
}
-
+
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
("%s:EncryptionType:%d key_len:%d, KeyId:%d"), __func__, setKey.encType, setKey.keyLength,
setKey.keyId);
for(i=0; i< ext->key_len; i++)
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
- ("%02x"), setKey.Key[i]);
+ ("%02x"), setKey.Key[i]);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
("\n"));
@@ -2351,7 +2376,7 @@ static int iw_set_ap_encodeext(struct net_device *dev,
"[%4d] WLANSAP_SetKeySta returned ERROR status= %d", __LINE__, vstatus );
retval = -EINVAL;
}
-
+
return retval;
}
@@ -2364,29 +2389,29 @@ static int iw_set_ap_mlme(struct net_device *dev,
#if 0
hdd_adapter_t *pAdapter = (netdev_priv(dev));
struct iw_mlme *mlme = (struct iw_mlme *)extra;
-
- ENTER();
-
+
+ ENTER();
+
//reason_code is unused. By default it is set to eCSR_DISCONNECT_REASON_UNSPECIFIED
switch (mlme->cmd) {
case IW_MLME_DISASSOC:
case IW_MLME_DEAUTH:
- hddLog(LOG1, "Station disassociate");
- if( pAdapter->conn_info.connState == eConnectionState_Associated )
+ hddLog(LOG1, "Station disassociate");
+ if( pAdapter->conn_info.connState == eConnectionState_Associated )
{
eCsrRoamDisconnectReason reason = eCSR_DISCONNECT_REASON_UNSPECIFIED;
-
+
if( mlme->reason_code == HDD_REASON_MICHAEL_MIC_FAILURE )
reason = eCSR_DISCONNECT_REASON_MIC_ERROR;
-
+
status = sme_RoamDisconnect( pAdapter->hHal,pAdapter->sessionId, reason);
-
+
//clear all the reason codes
if (status != 0)
{
hddLog(LOGE,"%s %d Command Disassociate/Deauthenticate : csrRoamDisconnect failure returned %d \n", __func__, (int)mlme->cmd, (int)status );
}
-
+
netif_stop_queue(dev);
netif_carrier_off(dev);
}
@@ -2399,7 +2424,7 @@ static int iw_set_ap_mlme(struct net_device *dev,
return -EINVAL;
}//end of switch
EXIT();
-#endif
+#endif
return 0;
// return status;
}
@@ -2498,7 +2523,7 @@ static int iw_get_mode(struct net_device *dev,
static int iw_softap_setwpsie(struct net_device *dev,
struct iw_request_info *info,
- union iwreq_data *wrqu,
+ union iwreq_data *wrqu,
char *extra)
{
hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
@@ -2510,7 +2535,7 @@ static int iw_softap_setwpsie(struct net_device *dev,
u_int8_t *pos;
tpSap_WPSIE pSap_WPSIe;
u_int8_t WPSIeType;
- u_int16_t length;
+ u_int16_t length;
ENTER();
if(!wrqu->data.length || wrqu->data.length <= QCSAP_MAX_WSC_IE)
@@ -2532,30 +2557,30 @@ static int iw_softap_setwpsie(struct net_device *dev,
}
pSap_WPSIe = vos_mem_malloc(sizeof(tSap_WPSIE));
- if (NULL == pSap_WPSIe)
+ if (NULL == pSap_WPSIe)
{
hddLog(LOGE, "VOS unable to allocate memory\n");
kfree(fwps_genie);
return -ENOMEM;
}
vos_mem_zero(pSap_WPSIe, sizeof(tSap_WPSIE));
-
+
hddLog(LOG1,"%s WPS IE type[0x%X] IE[0x%X], LEN[%d]\n", __func__, wps_genie[0], wps_genie[1], wps_genie[2]);
WPSIeType = wps_genie[0];
if ( wps_genie[0] == eQC_WPS_BEACON_IE)
{
- pSap_WPSIe->sapWPSIECode = eSAP_WPS_BEACON_IE;
+ pSap_WPSIe->sapWPSIECode = eSAP_WPS_BEACON_IE;
wps_genie = wps_genie + 1;
- switch ( wps_genie[0] )
+ switch ( wps_genie[0] )
{
- case DOT11F_EID_WPA:
+ case DOT11F_EID_WPA:
if (wps_genie[1] < 2 + 4)
{
- vos_mem_free(pSap_WPSIe);
+ vos_mem_free(pSap_WPSIe);
kfree(fwps_genie);
return -EINVAL;
}
- else if (memcmp(&wps_genie[2], "\x00\x50\xf2\x04", 4) == 0)
+ else if (memcmp(&wps_genie[2], "\x00\x50\xf2\x04", 4) == 0)
{
hddLog (LOG1, "%s Set WPS BEACON IE(len %d)",__func__, wps_genie[1]+2);
pos = &wps_genie[6];
@@ -2565,12 +2590,12 @@ static int iw_softap_setwpsie(struct net_device *dev,
{
case HDD_WPS_ELEM_VERSION:
pos += 4;
- pSap_WPSIe->sapwpsie.sapWPSBeaconIE.Version = *pos;
+ pSap_WPSIe->sapwpsie.sapWPSBeaconIE.Version = *pos;
hddLog(LOG1, "WPS version %d\n", pSap_WPSIe->sapwpsie.sapWPSBeaconIE.Version);
- pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_VER_PRESENT;
+ pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_VER_PRESENT;
pos += 1;
break;
-
+
case HDD_WPS_ELEM_WPS_STATE:
pos +=4;
pSap_WPSIe->sapwpsie.sapWPSBeaconIE.wpsState = *pos;
@@ -2597,22 +2622,22 @@ static int iw_softap_setwpsie(struct net_device *dev,
pSap_WPSIe->sapwpsie.sapWPSBeaconIE.DevicePasswordID = (*pos<<8) | *(pos+1);
hddLog(LOG1, "Password ID: %x\n", pSap_WPSIe->sapwpsie.sapWPSBeaconIE.DevicePasswordID);
pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_DEVICEPASSWORDID_PRESENT;
- pos += 2;
+ pos += 2;
break;
case HDD_WPS_ELEM_REGISTRA_CONF_METHODS:
pos += 4;
pSap_WPSIe->sapwpsie.sapWPSBeaconIE.SelectedRegistraCfgMethod = (*pos<<8) | *(pos+1);
hddLog(LOG1, "Select Registra Config Methods: %x\n", pSap_WPSIe->sapwpsie.sapWPSBeaconIE.SelectedRegistraCfgMethod);
pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_SELECTEDREGISTRACFGMETHOD_PRESENT;
- pos += 2;
+ pos += 2;
break;
-
+
case HDD_WPS_ELEM_UUID_E:
- pos += 2;
+ pos += 2;
length = *pos<<8 | *(pos+1);
pos += 2;
vos_mem_copy(pSap_WPSIe->sapwpsie.sapWPSBeaconIE.UUID_E, pos, length);
- pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_UUIDE_PRESENT;
+ pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_UUIDE_PRESENT;
pos += length;
break;
case HDD_WPS_ELEM_RF_BANDS:
@@ -2622,42 +2647,42 @@ static int iw_softap_setwpsie(struct net_device *dev,
pSap_WPSIe->sapwpsie.sapWPSBeaconIE.FieldPresent |= WPS_BEACON_RF_BANDS_PRESENT;
pos += 1;
break;
-
+
default:
hddLog (LOGW, "UNKNOWN TLV in WPS IE(%x)\n", (*pos<<8 | *(pos+1)));
vos_mem_free(pSap_WPSIe);
kfree(fwps_genie);
- return -EINVAL;
+ return -EINVAL;
}
- }
+ }
}
- else {
+ else {
hddLog (LOGE, "%s WPS IE Mismatch %X",
__func__, wps_genie[0]);
- }
+ }
break;
-
+
default:
hddLog (LOGE, "%s Set UNKNOWN IE %X",__func__, wps_genie[0]);
vos_mem_free(pSap_WPSIe);
kfree(fwps_genie);
return 0;
}
- }
+ }
else if( wps_genie[0] == eQC_WPS_PROBE_RSP_IE)
{
- pSap_WPSIe->sapWPSIECode = eSAP_WPS_PROBE_RSP_IE;
+ pSap_WPSIe->sapWPSIECode = eSAP_WPS_PROBE_RSP_IE;
wps_genie = wps_genie + 1;
- switch ( wps_genie[0] )
+ switch ( wps_genie[0] )
{
- case DOT11F_EID_WPA:
+ case DOT11F_EID_WPA:
if (wps_genie[1] < 2 + 4)
{
- vos_mem_free(pSap_WPSIe);
+ vos_mem_free(pSap_WPSIe);
kfree(fwps_genie);
return -EINVAL;
}
- else if (memcmp(&wps_genie[2], "\x00\x50\xf2\x04", 4) == 0)
+ else if (memcmp(&wps_genie[2], "\x00\x50\xf2\x04", 4) == 0)
{
hddLog (LOG1, "%s Set WPS PROBE RSP IE(len %d)",__func__, wps_genie[1]+2);
pos = &wps_genie[6];
@@ -2667,12 +2692,12 @@ static int iw_softap_setwpsie(struct net_device *dev,
{
case HDD_WPS_ELEM_VERSION:
pos += 4;
- pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.Version = *pos;
- hddLog(LOG1, "WPS version %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.Version);
- pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_VER_PRESENT;
+ pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.Version = *pos;
+ hddLog(LOG1, "WPS version %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.Version);
+ pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_VER_PRESENT;
pos += 1;
break;
-
+
case HDD_WPS_ELEM_WPS_STATE:
pos +=4;
pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.wpsState = *pos;
@@ -2691,7 +2716,7 @@ static int iw_softap_setwpsie(struct net_device *dev,
pos += 4;
pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.SelectedRegistra = *pos;
hddLog(LOG1, "Selected Registra %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.SelectedRegistra);
- pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_SELECTEDREGISTRA_PRESENT;
+ pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_SELECTEDREGISTRA_PRESENT;
pos += 1;
break;
case HDD_WPS_ELEM_DEVICE_PASSWORD_ID:
@@ -2699,14 +2724,14 @@ static int iw_softap_setwpsie(struct net_device *dev,
pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.DevicePasswordID = (*pos<<8) | *(pos+1);
hddLog(LOG1, "Password ID: %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.DevicePasswordID);
pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_DEVICEPASSWORDID_PRESENT;
- pos += 2;
+ pos += 2;
break;
case HDD_WPS_ELEM_REGISTRA_CONF_METHODS:
pos += 4;
pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.SelectedRegistraCfgMethod = (*pos<<8) | *(pos+1);
hddLog(LOG1, "Select Registra Config Methods: %x\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.SelectedRegistraCfgMethod);
pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_SELECTEDREGISTRACFGMETHOD_PRESENT;
- pos += 2;
+ pos += 2;
break;
case HDD_WPS_ELEM_RSP_TYPE:
pos += 4;
@@ -2716,14 +2741,14 @@ static int iw_softap_setwpsie(struct net_device *dev,
pos += 1;
break;
case HDD_WPS_ELEM_UUID_E:
- pos += 2;
+ pos += 2;
length = *pos<<8 | *(pos+1);
pos += 2;
vos_mem_copy(pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.UUID_E, pos, length);
pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_UUIDE_PRESENT;
pos += length;
break;
-
+
case HDD_WPS_ELEM_MANUFACTURER:
pos += 2;
length = *pos<<8 | *(pos+1);
@@ -2733,7 +2758,7 @@ static int iw_softap_setwpsie(struct net_device *dev,
pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_MANUFACTURE_PRESENT;
pos += length;
break;
-
+
case HDD_WPS_ELEM_MODEL_NAME:
pos += 2;
length = *pos<<8 | *(pos+1);
@@ -2764,16 +2789,16 @@ static int iw_softap_setwpsie(struct net_device *dev,
case HDD_WPS_ELEM_PRIMARY_DEVICE_TYPE:
pos += 4;
pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.PrimaryDeviceCategory = (*pos<<8 | *(pos+1));
- hddLog(LOG1, "primary dev category: %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.PrimaryDeviceCategory);
+ hddLog(LOG1, "primary dev category: %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.PrimaryDeviceCategory);
pos += 2;
-
+
vos_mem_copy(pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.PrimaryDeviceOUI, pos, HDD_WPS_DEVICE_OUI_LEN);
hddLog(LOG1, "primary dev oui: %02x, %02x, %02x, %02x\n", pos[0], pos[1], pos[2], pos[3]);
pos += 4;
pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.DeviceSubCategory = (*pos<<8 | *(pos+1));
- hddLog(LOG1, "primary dev sub category: %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.DeviceSubCategory);
+ hddLog(LOG1, "primary dev sub category: %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.DeviceSubCategory);
pos += 2;
- pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_PRIMARYDEVICETYPE_PRESENT;
+ pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_PRIMARYDEVICETYPE_PRESENT;
break;
case HDD_WPS_ELEM_DEVICE_NAME:
pos += 2;
@@ -2788,10 +2813,10 @@ static int iw_softap_setwpsie(struct net_device *dev,
pos += 4;
pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.ConfigMethod = (*pos<<8) | *(pos+1);
hddLog(LOG1, "Config Methods: %d\n", pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.SelectedRegistraCfgMethod);
- pos += 2;
+ pos += 2;
pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.FieldPresent |= WPS_PROBRSP_CONFIGMETHODS_PRESENT;
break;
-
+
case HDD_WPS_ELEM_RF_BANDS:
pos += 4;
pSap_WPSIe->sapwpsie.sapWPSProbeRspIE.RFBand = *pos;
@@ -2801,12 +2826,12 @@ static int iw_softap_setwpsie(struct net_device *dev,
break;
} // switch
}
- }
+ }
else
{
hddLog (LOGE, "%s WPS IE Mismatch %X",__func__, wps_genie[0]);
}
-
+
} // switch
}
halStatus = WLANSAP_Set_WpsIe(pVosContext, pSap_WPSIe);
@@ -2817,8 +2842,8 @@ static int iw_softap_setwpsie(struct net_device *dev,
//v_CONTEXT_t pVosContext = pHostapdAdapter->pvosContext;
WLANSAP_Update_WpsIe ( pVosContext );
}
-
- vos_mem_free(pSap_WPSIe);
+
+ vos_mem_free(pSap_WPSIe);
kfree(fwps_genie);
EXIT();
return halStatus;
@@ -2826,23 +2851,23 @@ static int iw_softap_setwpsie(struct net_device *dev,
static int iw_softap_stopbss(struct net_device *dev,
struct iw_request_info *info,
- union iwreq_data *wrqu,
+ union iwreq_data *wrqu,
char *extra)
{
hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
VOS_STATUS status = VOS_STATUS_SUCCESS;
ENTER();
- if(test_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags))
+ if(test_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags))
{
if ( VOS_STATUS_SUCCESS == (status = WLANSAP_StopBss((WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext) ) )
{
hdd_hostapd_state_t *pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pHostapdAdapter);
status = vos_wait_single_event(&pHostapdState->vosEvent, 10000);
-
+
if (!VOS_IS_STATUS_SUCCESS(status))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
("ERROR: HDD vos wait for single_event failed!!\n"));
VOS_ASSERT(0);
}
@@ -2901,7 +2926,7 @@ VOS_STATUS hdd_softap_get_sta_info(hdd_adapter_t *pAdapter, v_U8_t *pBuf, int bu
static int iw_softap_get_sta_info(struct net_device *dev,
struct iw_request_info *info,
- union iwreq_data *wrqu,
+ union iwreq_data *wrqu,
char *extra)
{
hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
@@ -2919,43 +2944,43 @@ static int iw_softap_get_sta_info(struct net_device *dev,
static int iw_set_ap_genie(struct net_device *dev,
struct iw_request_info *info,
- union iwreq_data *wrqu,
+ union iwreq_data *wrqu,
char *extra)
{
-
+
hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pvosContext;
eHalStatus halStatus= eHAL_STATUS_SUCCESS;
u_int8_t *genie = (u_int8_t *)extra;
ENTER();
-
+
if(!wrqu->data.length)
{
EXIT();
return 0;
}
- switch (genie[0])
+ switch (genie[0])
{
- case DOT11F_EID_WPA:
+ case DOT11F_EID_WPA:
case DOT11F_EID_RSN:
if((WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->uPrivacy == 0)
{
hdd_softap_Deregister_BC_STA(pHostapdAdapter);
hdd_softap_Register_BC_STA(pHostapdAdapter, 1);
- }
+ }
(WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->uPrivacy = 1;
halStatus = WLANSAP_Set_WPARSNIes(pVosContext, genie, wrqu->data.length);
break;
-
+
default:
hddLog (LOGE, "%s Set UNKNOWN IE %X",__func__, genie[0]);
halStatus = 0;
}
-
+
EXIT();
- return halStatus;
+ return halStatus;
}
static VOS_STATUS wlan_hdd_get_classAstats_for_station(hdd_adapter_t *pAdapter, u8 staid)
@@ -3312,23 +3337,23 @@ static const struct iw_priv_args hostapd_private_args[] = {
/* handlers for sub-ioctl */
{ WE_SET_WLAN_DBG,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
- 0,
+ 0,
"setwlandbg" },
/* handlers for main ioctl */
{ QCSAP_IOCTL_PRIV_SET_VAR_INT_GET_NONE,
IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
- 0,
+ 0,
"" },
/* handlers for sub-ioctl */
{ WE_LOG_DUMP_CMD,
IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
- 0,
+ 0,
"dump" },
{ WE_P2P_NOA_CMD,
IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
- 0,
+ 0,
"SetP2pPs" },
/* handlers for sub ioctl */
{
@@ -3347,12 +3372,12 @@ static const struct iw_priv_args hostapd_private_args[] = {
/* handlers for main ioctl */
{ QCSAP_IOCTL_MODIFY_ACL,
IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 8,
- 0,
+ 0,
"modify_acl" },
/* handlers for main ioctl */
{ QCSAP_IOCTL_GET_CHANNEL_LIST,
- 0,
+ 0,
IW_PRIV_TYPE_BYTE | sizeof(tChannelListInfo),
"getChannelList" },
@@ -3382,8 +3407,8 @@ static const struct iw_priv_args hostapd_private_args[] = {
static const iw_handler hostapd_private[] = {
[QCSAP_IOCTL_SETPARAM - SIOCIWFIRSTPRIV] = iw_softap_setparam, //set priv ioctl
- [QCSAP_IOCTL_GETPARAM - SIOCIWFIRSTPRIV] = iw_softap_getparam, //get priv ioctl
- [QCSAP_IOCTL_COMMIT - SIOCIWFIRSTPRIV] = iw_softap_commit, //get priv ioctl
+ [QCSAP_IOCTL_GETPARAM - SIOCIWFIRSTPRIV] = iw_softap_getparam, //get priv ioctl
+ [QCSAP_IOCTL_COMMIT - SIOCIWFIRSTPRIV] = iw_softap_commit, //get priv ioctl
[QCSAP_IOCTL_SETMLME - SIOCIWFIRSTPRIV] = iw_softap_setmlme,
[QCSAP_IOCTL_GET_STAWPAIE - SIOCIWFIRSTPRIV] = iw_get_genie, //get station genIE
[QCSAP_IOCTL_SETWPAIE - SIOCIWFIRSTPRIV] = iw_softap_setwpsie,
@@ -3394,7 +3419,7 @@ static const iw_handler hostapd_private[] = {
[QCSAP_IOCTL_ASSOC_STA_MACADDR - SIOCIWFIRSTPRIV] = iw_softap_getassoc_stamacaddr,
[QCSAP_IOCTL_DISASSOC_STA - SIOCIWFIRSTPRIV] = iw_softap_disassoc_sta,
[QCSAP_IOCTL_AP_STATS - SIOCIWFIRSTPRIV] = iw_softap_ap_stats,
- [QCSAP_IOCTL_PRIV_SET_THREE_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_set_three_ints_getnone,
+ [QCSAP_IOCTL_PRIV_SET_THREE_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_set_three_ints_getnone,
[QCSAP_IOCTL_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_set_var_ints_getnone,
[QCSAP_IOCTL_SET_CHANNEL_RANGE - SIOCIWFIRSTPRIV] = iw_softap_set_channel_range,
[QCSAP_IOCTL_MODIFY_ACL - SIOCIWFIRSTPRIV] = iw_softap_modify_acl,
@@ -3433,7 +3458,7 @@ struct net_device_ops net_ops_struct = {
int hdd_set_hostapd(hdd_adapter_t *pAdapter)
{
return VOS_STATUS_SUCCESS;
-}
+}
void hdd_set_ap_ops( struct net_device *pWlanHostapdDev )
{
@@ -3452,20 +3477,20 @@ void hdd_set_ap_ops( struct net_device *pWlanHostapdDev )
}
VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter )
-{
+{
hdd_hostapd_state_t * phostapdBuf;
struct net_device *dev = pAdapter->dev;
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
VOS_STATUS status;
ENTER();
- // Allocate the Wireless Extensions state structure
+ // Allocate the Wireless Extensions state structure
phostapdBuf = WLAN_HDD_GET_HOSTAP_STATE_PTR( pAdapter );
-
+
sme_SetCurrDeviceMode(pHddCtx->hHal, pAdapter->device_mode);
// Zero the memory. This zeros the profile structure.
memset(phostapdBuf, 0,sizeof(hdd_hostapd_state_t));
-
+
// Set up the pointer to the Wireless Extensions state structure
// NOP
status = hdd_set_hostapd(pAdapter);
@@ -3473,19 +3498,19 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter )
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: hdd_set_hostapd failed!!\n"));
return status;
}
-
+
status = vos_event_init(&phostapdBuf->vosEvent);
if (!VOS_IS_STATUS_SUCCESS(status))
{
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: Hostapd HDD vos event init failed!!\n"));
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
dev->wireless_handlers = (struct iw_handler_def *)& hostapd_handler_def;
@@ -3535,7 +3560,7 @@ hdd_adapter_t* hdd_wlan_create_ap_dev( hdd_context_t *pHddCtx, tSirMacAddr macAd
//Initialize the adapter context to zeros.
vos_mem_zero(pHostapdAdapter, sizeof( hdd_adapter_t ));
pHostapdAdapter->dev = pWlanHostapdDev;
- pHostapdAdapter->pHddCtx = pHddCtx;
+ pHostapdAdapter->pHddCtx = pHddCtx;
pHostapdAdapter->magic = WLAN_HDD_ADAPTER_MAGIC;
//Get the Global VOSS context.
@@ -3550,13 +3575,13 @@ hdd_adapter_t* hdd_wlan_create_ap_dev( hdd_context_t *pHddCtx, tSirMacAddr macAd
pWlanHostapdDev->watchdog_timeo = HDD_TX_TIMEOUT;
pWlanHostapdDev->mtu = HDD_DEFAULT_MTU;
-
+
vos_mem_copy(pWlanHostapdDev->dev_addr, (void *)macAddr,sizeof(tSirMacAddr));
vos_mem_copy(pHostapdAdapter->macAddressCurrent.bytes, (void *)macAddr, sizeof(tSirMacAddr));
pWlanHostapdDev->destructor = free_netdev;
pWlanHostapdDev->ieee80211_ptr = &pHostapdAdapter->wdev ;
- pHostapdAdapter->wdev.wiphy = pHddCtx->wiphy;
+ pHostapdAdapter->wdev.wiphy = pHddCtx->wiphy;
pHostapdAdapter->wdev.netdev = pWlanHostapdDev;
init_completion(&pHostapdAdapter->tx_action_cnf_event);
init_completion(&pHostapdAdapter->cancel_rem_on_chan_var);
@@ -3580,21 +3605,21 @@ VOS_STATUS hdd_register_hostapd( hdd_adapter_t *pAdapter, tANI_U8 rtnl_lock_held
VOS_STATUS status = VOS_STATUS_SUCCESS;
ENTER();
-
+
if( rtnl_lock_held )
{
if (strnchr(dev->name, strlen(dev->name), '%')) {
if( dev_alloc_name(dev, dev->name) < 0 )
{
hddLog(VOS_TRACE_LEVEL_FATAL, "%s:Failed:dev_alloc_name", __func__);
- return VOS_STATUS_E_FAILURE;
+ return VOS_STATUS_E_FAILURE;
}
}
if (register_netdevice(dev))
{
hddLog(VOS_TRACE_LEVEL_FATAL,
"%s:Failed:register_netdevice", __func__);
- return VOS_STATUS_E_FAILURE;
+ return VOS_STATUS_E_FAILURE;
}
}
else
@@ -3606,15 +3631,15 @@ VOS_STATUS hdd_register_hostapd( hdd_adapter_t *pAdapter, tANI_U8 rtnl_lock_held
}
}
set_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
-
+
EXIT();
return status;
}
-
+
VOS_STATUS hdd_unregister_hostapd(hdd_adapter_t *pAdapter)
{
ENTER();
-
+
hdd_softap_deinit_tx_rx(pAdapter);
/* if we are being called during driver unload, then the dev has already
diff --git a/CORE/HDD/src/wlan_hdd_ipa.c b/CORE/HDD/src/wlan_hdd_ipa.c
new file mode 100644
index 000000000000..3a5aa5dce3d8
--- /dev/null
+++ b/CORE/HDD/src/wlan_hdd_ipa.c
@@ -0,0 +1,1559 @@
+/*
+ * Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ *
+ * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+ *
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This file was originally distributed by Qualcomm Atheros, Inc.
+ * under proprietary terms before Copyright ownership was assigned
+ * to the Linux Foundation.
+ */
+
+/*========================================================================
+
+\file wlan_hdd_ipa.c
+
+\brief WLAN HDD and ipa interface implementation
+
+========================================================================*/
+
+/*--------------------------------------------------------------------------
+Include Files
+------------------------------------------------------------------------*/
+#ifdef IPA_OFFLOAD
+
+#include <wlan_hdd_includes.h>
+#include <wlan_hdd_ipa.h>
+
+#include <linux/etherdevice.h>
+#include <linux/atomic.h>
+#include <linux/netdevice.h>
+#include <linux/skbuff.h>
+#include <linux/list.h>
+#include <linux/debugfs.h>
+
+#define HDD_IPA_DESC_BUFFER_RATIO 4
+#define HDD_IPA_IPV4_NAME_EXT "_ipv4"
+#define HDD_IPA_IPV6_NAME_EXT "_ipv6"
+
+#define HDD_IPA_RX_INACTIVITY_MSEC_DELAY 2000
+
+const uint8_t ipa_set_hdr[] = {
+/*IPA-WLAN HDR */
+ 0x00, 0x00, /* Reserved */
+#define HDD_IPA_WLAN_HDR_DEV_INFO_OFFSET 2
+#define HDD_IPA_WLAN_HDR_DEV_TYPE_MASK 0x80
+#define HDD_IPA_WLAN_HDR_DEV_TYPE_AP 0x80
+#define HDD_IPA_WLAN_HDR_DEV_TYPE_STA 0x00
+#define HDD_IPA_WLAN_HDR_DEV_ID_MASK 0x7F
+#define HDD_IPA_WLAN_HDR_STA_ID_OFFSET 3
+ 0x00, 0x00,
+ /* dev_id and sta_id filled by wlan*/
+
+ /* 802.3 header - 14 bytes*/
+#define HDD_IPA_WLAN_HDR_DES_MAC_OFFSET 4
+ 0x00, 0x03, 0x7f, 0xaa, 0xbb, 0xcc,
+ /* Des_MAC filled by IPA */
+#define HDD_IPA_WLAN_HDR_SRC_MAC_OFFSET 10
+ 0x00, 0x03, 0x7f, 0xdd, 0xee, 0xff,
+ /* Src. MAC filled by IPA */
+ 0x00, 0x00,
+ /* length can be zero */
+
+ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00,
+ /* LLC SNAP header 8 bytes */
+#define HDD_IPA_WLAN_HDR_IP_VER_OFFSET 24
+ 0x08, 0x00
+ /* type value(2 bytes) ,filled by wlan */
+ /* 0x0800 - IPV4, 0x86dd - IPV6 */
+};
+
+
+#define HDD_IPA_WLAN_HDR_LEN sizeof(ipa_set_hdr)
+#define HDD_IPA_WLAN_HDR_ONLY_LEN 4
+#define HDD_IPA_MAX_TX_PIPE_MAP 8
+#define HDD_IPA_WLAN_HDR_PARTIAL 1
+
+#define HDD_IPA_LOG(LVL, fmt, args...) VOS_TRACE(VOS_MODULE_ID_HDD, LVL, \
+ "%s:%d "fmt"\n", __func__, __LINE__, ## args)
+
+enum hdd_ipa_rm_state {
+ HDD_IPA_RM_RELEASED,
+ HDD_IPA_RM_GRANT_PENDING,
+ HDD_IPA_RM_GRANTED,
+ HDD_IPA_RM_RELEASE_PENDING,
+};
+
+enum hdd_ipa_pipe_index {
+ HDD_IPA_TX_VI_PIPE,
+ HDD_IPA_TX_VO_PIPE,
+ HDD_IPA_TX_BE_PIPE,
+ HDD_IPA_TX_BK_PIPE,
+ HDD_IPA_RX_PIPE,
+ HDD_IPA_MAX_PIPE
+};
+
+enum hdd_ipa_ip_ver {
+ HDD_IPA_IPV4 = 1,
+ HDD_IPA_IPV6 = 2
+};
+
+uint8_t hdd_ipa_pipe_client[HDD_IPA_MAX_PIPE] = {
+ IPA_CLIENT_WLAN1_CONS,
+ IPA_CLIENT_WLAN2_CONS,
+ IPA_CLIENT_WLAN3_CONS,
+ IPA_CLIENT_WLAN4_CONS,
+ IPA_CLIENT_WLAN1_PROD
+};
+
+uint8_t hdd_ipa_pipe_client_AC[] = {
+ HDD_LINUX_AC_VI,
+ HDD_LINUX_AC_VO,
+ HDD_LINUX_AC_BE,
+ HDD_LINUX_AC_BK
+};
+
+static struct hdd_ipa_tx_pipe_map{
+ uint8_t tos_value;
+ enum ipa_client_type client;
+ uint8_t ac;
+} hdd_ipa_tx_pipe_map_info[HDD_IPA_MAX_TX_PIPE_MAP] = {
+ /* BK */
+ {1, IPA_CLIENT_WLAN1_CONS, HDD_LINUX_AC_BK},
+ {2, IPA_CLIENT_WLAN1_CONS, HDD_LINUX_AC_BK},
+ /* BE */
+ {0, IPA_CLIENT_WLAN2_CONS, HDD_LINUX_AC_BE},
+ {3, IPA_CLIENT_WLAN2_CONS, HDD_LINUX_AC_BE},
+ /* VI */
+ {4, IPA_CLIENT_WLAN3_CONS, HDD_LINUX_AC_VI},
+ {5, IPA_CLIENT_WLAN3_CONS, HDD_LINUX_AC_VI},
+ /* VO */
+ {6, IPA_CLIENT_WLAN4_CONS, HDD_LINUX_AC_VO},
+ {7, IPA_CLIENT_WLAN4_CONS, HDD_LINUX_AC_VO},
+};
+
+struct hdd_ipa_sys_pipe {
+ uint32_t conn_hdl;
+ uint8_t conn_hdl_valid;
+ struct ipa_sys_connect_params ipa_sys_params;
+};
+
+struct hdd_ipa_priv {
+ struct hdd_ipa_sys_pipe sys_pipe[HDD_IPA_MAX_PIPE];
+ atomic_t rm_state;
+#ifndef HDD_IPA_USE_IPA_RM_TIMER
+ struct timer_list rm_timer;
+ uint8_t rm_timer_on;
+#endif
+ uint32_t pending_desc_cnt;
+ uint32_t hw_desc_cnt;
+ spinlock_t q_lock;
+ struct list_head free_desc_head;
+ struct list_head pend_desc_head;
+
+ hdd_context_t *hdd_ctx;
+
+ struct dentry *debugfs_dir;
+ struct {
+ uint64_t prefilter;
+ uint64_t rm_grant;
+ uint64_t rm_release;
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ uint64_t rx_ipa_rm_qued;
+#endif
+ uint64_t rx_ipa_sent_desc_cnt;
+ uint64_t rx_ipa_write_done;
+ uint64_t rx_ipa_excep;
+
+ uint64_t rx_ipa_hw_maxed_out;
+
+ uint64_t tx_ipa_recv;
+ uint64_t freeq_empty;
+ uint64_t freeq_cnt;
+
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ uint64_t rxt_drop;
+ uint64_t rxt_recv;
+ uint64_t rx_ipa_hw_max_qued;
+ uint64_t rxt_d_drop;
+ uint64_t rxt_dh_drop;
+ uint64_t rxt_0;
+ uint64_t rxt_1;
+ uint64_t rxt_2;
+ uint64_t rxt_3;
+ uint64_t rxt_4;
+ uint64_t rxt_5;
+ uint64_t rxt_6;
+ uint64_t freeq_use;
+ uint64_t freeq_reclaim;
+ uint64_t rx_ipa_dh_sent;
+ uint64_t rx_ipa_dh_reclaim;
+ uint64_t rx_ipa_dh_not_used;
+#endif
+ }stats;
+};
+
+enum hdd_ipa_evt {
+ HDD_IPA_RXT_EVT,
+ HDD_IPA_WRITE_DONE_EVT,
+ HDD_IPA_RM_GRANT_EVT
+};
+
+struct hdd_ipa_rxt {
+ uint8_t sta_id;
+ adf_nbuf_t rx_buf_list;
+};
+
+
+
+static struct hdd_ipa_priv *ghdd_ipa;
+static void hdd_ipa_process_evt(int evt, void *priv);
+
+bool hdd_ipa_is_enabled(hdd_context_t *hdd_ctx)
+{
+ return hdd_ctx->cfg_ini->IpaEnable;
+}
+
+static inline void *hdd_ipa_kzalloc(uint32_t size)
+{
+ void *data = NULL;
+
+ data = adf_os_mem_alloc(NULL, size);
+ return data;
+}
+
+static inline struct ipa_tx_data_desc * hdd_ipa_get_desc_from_freeq(void)
+{
+ struct hdd_ipa_priv *hdd_ipa = ghdd_ipa;
+ struct ipa_tx_data_desc *desc = NULL;
+
+ spin_lock_bh(&ghdd_ipa->q_lock);
+ if(!list_empty(&ghdd_ipa->free_desc_head)) {
+ desc = list_first_entry(&ghdd_ipa->free_desc_head, struct ipa_tx_data_desc, link);
+ list_del(&desc->link);
+ hdd_ipa->stats.freeq_cnt--;
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ hdd_ipa->stats.freeq_use++;
+#endif
+ } else {
+ hdd_ipa->stats.freeq_empty++;
+ }
+ spin_unlock_bh(&ghdd_ipa->q_lock);
+ return desc;
+}
+
+static inline bool hdd_ipa_can_pre_filter(struct hdd_ipa_priv *hdd_ipa)
+{
+ hdd_context_t *hdd_ctx = hdd_ipa->hdd_ctx;
+ return hdd_ctx->cfg_ini->IpaPreFilterEnable;
+}
+
+static inline bool hdd_ipa_is_ipv6_enabled(struct hdd_ipa_priv *hdd_ipa)
+{
+ hdd_context_t *hdd_ctx = hdd_ipa->hdd_ctx;
+ return hdd_ctx->cfg_ini->IpaIPv6Enable;
+}
+
+static inline bool hdd_ipa_is_rm_enabled(struct hdd_ipa_priv *hdd_ipa)
+{
+ hdd_context_t *hdd_ctx = hdd_ipa->hdd_ctx;
+ return hdd_ctx->cfg_ini->IpaRMEnable;
+}
+
+static int hdd_ipa_rm_request(struct hdd_ipa_priv *hdd_ipa)
+{
+ int ret = 0;
+
+ if (!hdd_ipa_is_rm_enabled(hdd_ipa)) {
+ atomic_set(&hdd_ipa->rm_state, HDD_IPA_RM_GRANTED);
+ return 0;
+ }
+#ifdef HDD_IPA_USE_IPA_RM_TIMER
+ ret = ipa_rm_inactivity_timer_request_resource(
+ IPA_RM_RESOURCE_WLAN_PROD);
+#else
+ ret = ipa_rm_request_resource(IPA_RM_RESOURCE_WLAN_PROD);
+#endif
+ if (ret == 0) {
+ atomic_set(&hdd_ipa->rm_state, HDD_IPA_RM_GRANTED);
+ hdd_ipa->stats.rm_grant++;
+ }
+ return ret;
+}
+
+static int hdd_ipa_rm_release(struct hdd_ipa_priv *hdd_ipa)
+{
+ int ret = 0;
+
+ if (!hdd_ipa_is_rm_enabled(hdd_ipa))
+ return 0;
+
+#ifdef HDD_IPA_USE_IPA_RM_TIMER
+ ret = ipa_rm_inactivity_timer_release_resource(
+ IPA_RM_RESOURCE_WLAN_PROD);
+#else
+ ret = ipa_rm_release_resource(IPA_RM_RESOURCE_WLAN_PROD);
+#endif
+ if (ret == 0) {
+ atomic_set(&hdd_ipa->rm_state, HDD_IPA_RM_RELEASED);
+ hdd_ipa->stats.rm_release++;
+ }
+ return ret;
+}
+
+static void hdd_ipa_rm_notify(void *user_data, enum ipa_rm_event event,
+ unsigned long data)
+{
+ struct hdd_ipa_priv *hdd_ipa = ghdd_ipa;
+ if (!hdd_ipa_is_rm_enabled(hdd_ipa))
+ return;
+
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "Evt: %d", event);
+
+ if (event == IPA_RM_RESOURCE_GRANTED) {
+ atomic_set(&hdd_ipa->rm_state, HDD_IPA_RM_GRANTED);
+ hdd_ipa->stats.rm_grant++;
+ hdd_ipa_process_evt(HDD_IPA_RM_GRANT_EVT, NULL);
+ } else {
+ if (event == IPA_RM_RESOURCE_RELEASED) {
+ atomic_set(&hdd_ipa->rm_state, HDD_IPA_RM_RELEASED);
+ hdd_ipa->stats.rm_release++;
+ }
+ }
+}
+
+static int hdd_ipa_setup_rm(struct hdd_ipa_priv *hdd_ipa)
+{
+ struct ipa_rm_create_params create_params = {0};
+ int ret;
+
+ if (!hdd_ipa_is_rm_enabled(hdd_ipa))
+ return 0;
+ create_params.name = IPA_RM_RESOURCE_WLAN_PROD;
+ create_params.reg_params.user_data = hdd_ipa;
+ create_params.reg_params.notify_cb = hdd_ipa_rm_notify;
+ create_params.request_resource = NULL;
+ create_params.release_resource = NULL;
+
+ ret = ipa_rm_create_resource(&create_params);
+ if (ret) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "create resource fail");
+ goto setup_rm_fail;
+ }
+
+#ifdef HDD_IPA_USE_IPA_RM_TIMER
+ ret = ipa_rm_inactivity_timer_init(IPA_RM_RESOURCE_WLAN_PROD,
+ HDD_IPA_RX_INACTIVITY_MSEC_DELAY);
+ if (ret) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "timer fail");
+ goto setup_rm_fail;
+ }
+#endif
+
+setup_rm_fail:
+ return ret;
+}
+
+static void hdd_ipa_destory_rm_resource(struct hdd_ipa_priv *hdd_ipa)
+{
+ int ret;
+
+ if (!hdd_ipa_is_rm_enabled(hdd_ipa))
+ return;
+
+ ipa_rm_delete_dependency(IPA_RM_RESOURCE_WLAN_PROD,
+ IPA_RM_RESOURCE_A2_CONS);
+#ifdef HDD_IPA_USE_IPA_RM_TIMER
+ ipa_rm_inactivity_timer_destroy(IPA_RM_RESOURCE_WLAN_PROD);
+#endif
+ ret = ipa_rm_delete_resource(IPA_RM_RESOURCE_WLAN_PROD);
+ if (ret)
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "fail");
+}
+
+void hdd_ipa_rm_timer_handler(unsigned long ptr)
+{
+ struct hdd_ipa_priv *hdd_ipa = ghdd_ipa;
+ atomic_set(&hdd_ipa->rm_state,
+ HDD_IPA_RM_RELEASE_PENDING);
+ hdd_ipa_rm_release(hdd_ipa);
+}
+
+void hdd_ipa_send_skb_to_network(adf_nbuf_t skb, hdd_adapter_t *adap_dev)
+{
+ if (!adap_dev || (adap_dev &&
+ adap_dev->magic != WLAN_HDD_ADAPTER_MAGIC)) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "Invalid sta_id");
+ adf_nbuf_free(skb);
+ return;
+ }
+ skb->dev = adap_dev->dev;
+ skb->protocol = eth_type_trans(skb, skb->dev);
+ skb->ip_summed = CHECKSUM_NONE;
+ ++adap_dev->hdd_stats.hddTxRxStats.rxPackets;
+ ++adap_dev->stats.rx_packets;
+ adap_dev->stats.rx_bytes += skb->len;
+ if (netif_rx_ni(skb) == NET_RX_SUCCESS)
+ ++adap_dev->hdd_stats.hddTxRxStats.rxDelivered;
+ else
+ ++adap_dev->hdd_stats.hddTxRxStats.rxRefused;
+ adap_dev->dev->last_rx = jiffies;
+}
+
+static void hdd_ipa_send_pkt_to_ipa(struct ipa_tx_data_desc *send_desc_head,
+ int send_desc_cnt)
+{
+ struct hdd_ipa_priv *hdd_ipa = ghdd_ipa;
+ struct ipa_tx_data_desc *send_desc;
+ uint32_t cur_send_cnt = 0;
+#ifndef HDD_IPA_USE_IPA_RM_TIMER
+ if (hdd_ipa->rm_timer_on) {
+ del_timer(&hdd_ipa->rm_timer);
+ hdd_ipa->rm_timer_on = 0;
+ }
+#endif
+ /* In RM GRANT CTX send_desc_head is null */
+ if (!send_desc_head) {
+ send_desc_head = hdd_ipa_get_desc_from_freeq();
+ if (!send_desc_head)
+ return;
+
+ INIT_LIST_HEAD(&send_desc_head->link);
+ }
+
+ spin_lock_bh(&hdd_ipa->q_lock);
+ if ((hdd_ipa->pending_desc_cnt + send_desc_cnt)
+ < hdd_ipa->hw_desc_cnt) {
+
+ if (!list_empty(&hdd_ipa->pend_desc_head)) {
+ list_splice_tail_init(&send_desc_head->link,
+ &hdd_ipa->pend_desc_head);
+ while ((hdd_ipa->pending_desc_cnt <
+ hdd_ipa->hw_desc_cnt) &&
+ !(list_empty(
+ &hdd_ipa->pend_desc_head))) {
+ send_desc = list_first_entry(
+ &ghdd_ipa->pend_desc_head,
+ struct ipa_tx_data_desc, link);
+ list_del(&send_desc->link);
+ list_add_tail(&send_desc->link,
+ &send_desc_head->link);
+ hdd_ipa->pending_desc_cnt++;
+ cur_send_cnt++;
+ }
+ } else {
+ hdd_ipa->pending_desc_cnt += send_desc_cnt;
+ cur_send_cnt = send_desc_cnt;
+ }
+ hdd_ipa->stats.rx_ipa_sent_desc_cnt += cur_send_cnt;
+ spin_unlock_bh(&hdd_ipa->q_lock);
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ hdd_ipa->stats.rx_ipa_dh_sent++; //for desc head
+#endif
+ ipa_tx_dp_mul(hdd_ipa_pipe_client[HDD_IPA_RX_PIPE],
+ send_desc_head);
+ } else {
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ hdd_ipa->stats.rx_ipa_hw_max_qued += send_desc_cnt;
+#endif
+
+ hdd_ipa->stats.rx_ipa_hw_maxed_out++;
+ list_splice_tail_init(&send_desc_head->link,
+ &hdd_ipa->pend_desc_head);
+ list_add_tail(&send_desc_head->link, &hdd_ipa->free_desc_head);
+ hdd_ipa->stats.freeq_cnt++;
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ hdd_ipa->stats.rx_ipa_dh_not_used++;
+ hdd_ipa->stats.freeq_reclaim++;
+#endif
+ spin_unlock_bh(&hdd_ipa->q_lock);
+ }
+
+}
+
+static int hdd_ipa_is_ip_pkt(void *data, uint8_t ip_ver)
+{
+ struct ethhdr *eth = data;
+ struct llc_snap_hdr {
+ uint8_t dsap;
+ uint8_t ssap;
+ uint8_t resv[4];
+ __be16 eth_type;
+ } __packed;
+ struct llc_snap_hdr *ls_hdr;
+ uint16_t eth_type;
+ int ret = 0;
+
+ eth_type = be16_to_cpu(eth->h_proto);
+ if (eth_type < 0x600) {
+ /* Non Ethernet II framing format */
+ ls_hdr = (struct llc_snap_hdr *)((uint8_t *)data +
+ sizeof(struct ethhdr));
+ /* TODO Is this needed
+ if ((ls_hdr->dsap == 0xAA && ls_hdr->ssap == 0xAA) ||
+ (ls_hdr->dsap == 0xAB && ls_hdr->ssap == 0xAB))
+ */
+ eth_type = be16_to_cpu(ls_hdr->eth_type);
+ }
+
+ if (eth_type == 0x0800 && ip_ver == HDD_IPA_IPV4)
+ ret = 1;
+ else if (eth_type == 0x86dd && ip_ver == HDD_IPA_IPV6)
+ ret = 1;
+
+ return ret;
+}
+
+
+static void hdd_ipa_process_evt(int evt, void *priv)
+{
+ struct hdd_ipa_priv *hdd_ipa = ghdd_ipa;
+ struct hdd_ipa_rxt *rxt;
+ struct ipa_tx_data_desc *send_desc_head = NULL, *send_desc,
+ *done_desc_head, *done_desc, *tmp;
+ hdd_adapter_t *adap_dev = NULL;
+ adf_nbuf_t buf, next_buf;
+ uint8_t dev_id, cur_cnt = 0, iftype;
+
+ switch (evt) {
+ case HDD_IPA_RXT_EVT:
+ rxt = priv;
+
+ adap_dev = hdd_ipa->hdd_ctx->sta_to_adapter[rxt->sta_id];
+ if (!adap_dev ||
+ (adap_dev && adap_dev->magic != WLAN_HDD_ADAPTER_MAGIC)) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "Invalid sta_id");
+ buf = rxt->rx_buf_list;
+ while (buf) {
+ next_buf = adf_nbuf_queue_next(buf);
+ adf_nbuf_free(buf);
+ /* here if ipa is stuck we can send
+ to network if required as fail safe
+ */
+ buf = next_buf;
+ }
+ return;
+ }
+ dev_id = adap_dev->dev->ifindex;
+ iftype = adap_dev->wdev.iftype;
+ /* send_desc_head is a anchor node */
+ send_desc_head = hdd_ipa_get_desc_from_freeq();
+ if (!send_desc_head) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "send_desc_head=Null. FreeQ Empty");
+ buf = rxt->rx_buf_list;
+ while (buf) {
+ next_buf = adf_nbuf_queue_next(buf);
+ adf_nbuf_free(buf);
+ /* here if ipa is stuck we can send
+ to network if required as fail safe
+ */
+ buf = next_buf;
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ hdd_ipa->stats.rxt_recv++;
+ hdd_ipa->stats.rxt_drop++;
+#endif
+ }
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ hdd_ipa->stats.rxt_dh_drop++;
+#endif
+ return;
+ }
+
+ INIT_LIST_HEAD(&send_desc_head->link);
+ buf = rxt->rx_buf_list;
+ while (buf) {
+ next_buf = adf_nbuf_queue_next(buf);
+ if (hdd_ipa_can_pre_filter(hdd_ipa) &&
+ (!hdd_ipa_is_ip_pkt(buf->data, HDD_IPA_IPV4) ||
+ (!hdd_ipa_is_ipv6_enabled(hdd_ipa) &&
+ hdd_ipa_is_ip_pkt(buf->data, HDD_IPA_IPV6)))) {
+ hdd_ipa->stats.prefilter++;
+ hdd_ipa_send_skb_to_network(buf, adap_dev);
+ buf = next_buf;
+ continue;
+ }
+
+ skb_push(buf, HDD_IPA_WLAN_HDR_ONLY_LEN);
+ memset(buf->data, 0, HDD_IPA_WLAN_HDR_ONLY_LEN);
+ buf->data[HDD_IPA_WLAN_HDR_STA_ID_OFFSET] = rxt->sta_id;
+ buf->data[HDD_IPA_WLAN_HDR_DEV_INFO_OFFSET] |=
+ dev_id & HDD_IPA_WLAN_HDR_DEV_ID_MASK;
+ if (iftype == NL80211_IFTYPE_AP ||
+ iftype == NL80211_IFTYPE_P2P_GO) {
+ buf->data[HDD_IPA_WLAN_HDR_DEV_INFO_OFFSET] |=
+ HDD_IPA_WLAN_HDR_DEV_TYPE_AP;
+ } else {
+ buf->data[HDD_IPA_WLAN_HDR_DEV_INFO_OFFSET] |=
+ HDD_IPA_WLAN_HDR_DEV_TYPE_STA;
+ }
+
+ /* TODO Chk if needed
+ if (hdd_ipa_is_ip_pkt(buf->data, HDD_IPA_IPV6) {
+ buf->data[HDD_IPA_WLAN_HDR_IP_VER_OFFSET]
+ = 0x86;
+ buf->data[HDD_IPA_WLAN_HDR_IP_VER_OFFSET + 1]
+ = 0xdd;
+ }
+ skb_pull(buf, HDD_IPA_WLAN_HDR_LEN);
+ skb_push(buf, HDD_IPA_WLAN_HDR_ONLY_LEN);*/
+ send_desc = hdd_ipa_get_desc_from_freeq();
+ if (send_desc) {
+ send_desc->priv = buf;
+ send_desc->pyld_buffer = buf->data;
+ send_desc->pyld_len = buf->len;
+ list_add_tail(&send_desc->link,
+ &send_desc_head->link);
+ cur_cnt++;
+ } else {
+ adf_nbuf_free(buf); /*No desc available; drop*/
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ hdd_ipa->stats.rxt_drop++;
+ hdd_ipa->stats.rxt_d_drop++;
+#endif
+ }
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ hdd_ipa->stats.rxt_recv++;
+#endif
+ buf = next_buf;
+ }
+
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ if (cur_cnt == 0)
+ hdd_ipa->stats.rxt_0++;
+ else if (cur_cnt == 1)
+ hdd_ipa->stats.rxt_1++;
+ else if (cur_cnt == 2)
+ hdd_ipa->stats.rxt_2++;
+ else if (cur_cnt == 3)
+ hdd_ipa->stats.rxt_3++;
+ else if (cur_cnt == 4)
+ hdd_ipa->stats.rxt_4++;
+ else if (cur_cnt == 5)
+ hdd_ipa->stats.rxt_5++;
+ else if (cur_cnt > 5)
+ hdd_ipa->stats.rxt_6++;
+#endif
+
+ if(cur_cnt == 0){
+ spin_lock_bh(&hdd_ipa->q_lock);
+ list_add_tail(&send_desc_head->link, &hdd_ipa->free_desc_head);
+ hdd_ipa->stats.freeq_cnt++;
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ hdd_ipa->stats.rx_ipa_dh_not_used++;
+ hdd_ipa->stats.freeq_reclaim++;
+#endif
+ spin_unlock_bh(&hdd_ipa->q_lock);
+ goto rxt_end;
+ }
+
+ if (atomic_read(&hdd_ipa->rm_state) == HDD_IPA_RM_GRANTED) {
+ hdd_ipa_send_pkt_to_ipa(send_desc_head, cur_cnt);
+ } else {
+ if (atomic_read(&hdd_ipa->rm_state)
+ != HDD_IPA_RM_GRANT_PENDING) {
+ atomic_set(&hdd_ipa->rm_state,
+ HDD_IPA_RM_GRANT_PENDING);
+ hdd_ipa_rm_request(hdd_ipa);
+ }
+ //hdd_ipa_rm_request can immediately grant so check again.
+ if (atomic_read(&hdd_ipa->rm_state)
+ == HDD_IPA_RM_GRANT_PENDING) {
+ spin_lock_bh(&hdd_ipa->q_lock);
+ list_splice_tail_init(&send_desc_head->link,
+ &hdd_ipa->pend_desc_head);
+ /* return anchor node */
+ list_add_tail(&send_desc_head->link,
+ &hdd_ipa->free_desc_head);
+ spin_unlock_bh(&hdd_ipa->q_lock);
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ hdd_ipa->stats.rx_ipa_rm_qued += cur_cnt;
+#endif
+ } else {
+ hdd_ipa_send_pkt_to_ipa(send_desc_head,
+ cur_cnt);
+ }
+ }
+rxt_end:
+ break;
+
+ case HDD_IPA_RM_GRANT_EVT:
+ hdd_ipa_send_pkt_to_ipa(NULL, 0);
+ break;
+
+ case HDD_IPA_WRITE_DONE_EVT:
+ done_desc_head = priv;
+ spin_lock_bh(&hdd_ipa->q_lock);
+ list_for_each_entry_safe(done_desc, tmp,
+ &done_desc_head->link, link) {
+ list_del(&done_desc->link);
+ buf = done_desc->priv;
+ adf_nbuf_free(buf);
+ done_desc->priv = NULL;
+ done_desc->pyld_buffer = NULL;
+ done_desc->pyld_len = 0;
+ list_add_tail(&done_desc->link, &hdd_ipa->free_desc_head);
+ hdd_ipa->stats.freeq_cnt++;
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ hdd_ipa->stats.freeq_reclaim++;
+#endif
+ hdd_ipa->pending_desc_cnt--;
+ hdd_ipa->stats.rx_ipa_write_done++;
+ }
+ /* add anchor node also back to free list */
+ list_add_tail(&done_desc_head->link, &hdd_ipa->free_desc_head);
+ hdd_ipa->stats.freeq_cnt++;
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ hdd_ipa->stats.rx_ipa_dh_reclaim++;
+ hdd_ipa->stats.freeq_reclaim++;
+#endif
+ spin_unlock_bh(&hdd_ipa->q_lock);
+
+ if (list_empty(&hdd_ipa->pend_desc_head)) {
+ if (atomic_read(&hdd_ipa->rm_state)
+ != HDD_IPA_RM_RELEASE_PENDING) {
+#ifndef HDD_IPA_USE_IPA_RM_TIMER
+ del_timer(&hdd_ipa->rm_timer);
+ mod_timer(&hdd_ipa->rm_timer,
+ jiffies +
+ msecs_to_jiffies(
+ HDD_IPA_RX_INACTIVITY_MSEC_DELAY));
+ hdd_ipa->rm_timer_on = 1;
+#else
+ atomic_set(&hdd_ipa->rm_state,
+ HDD_IPA_RM_RELEASE_PENDING);
+ hdd_ipa_rm_release(hdd_ipa);
+#endif
+ }
+ } else {
+ /* no rx pkt come in so flash the last few */
+ hdd_ipa_send_pkt_to_ipa(NULL, 0);
+ }
+ break;
+ }
+}
+
+static void hdd_ipa_w2i_write_done_handler(
+ struct ipa_tx_data_desc *done_desc_head)
+{
+ hdd_ipa_process_evt(HDD_IPA_WRITE_DONE_EVT, done_desc_head);
+}
+
+VOS_STATUS hdd_ipa_process_rxt(v_VOID_t *vosContext, adf_nbuf_t rx_buf_list,
+ v_U8_t sta_id)
+{
+ struct hdd_ipa_priv *hdd_ipa = ghdd_ipa;
+ struct hdd_ipa_rxt rxt;
+
+ if (!hdd_ipa_is_enabled(hdd_ipa->hdd_ctx))
+ return VOS_STATUS_E_INVAL;
+
+ rxt.sta_id = sta_id;
+ rxt.rx_buf_list = rx_buf_list;
+ hdd_ipa_process_evt(HDD_IPA_RXT_EVT, &rxt);
+
+ return VOS_STATUS_SUCCESS;
+}
+
+
+
+void hdd_ipa_w2i_cb(void *priv, enum ipa_dp_evt_type evt, unsigned long data)
+{
+ struct hdd_ipa_priv *hdd_ipa = ghdd_ipa;
+ uint8_t client;
+ struct ipa_tx_data_desc *done_desc_head;
+ adf_nbuf_t skb;
+ uint8_t sta_id, dev_id;
+ hdd_adapter_t *adap_dev;
+
+ client = *((uint8_t *)priv);
+ if (client != hdd_ipa_pipe_client[HDD_IPA_RX_PIPE]) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR,
+ "w2i cb wrong pipe: %d %x %x",
+ client, priv,
+ &hdd_ipa_pipe_client[HDD_IPA_RX_PIPE]);
+ return;
+ }
+
+ switch (evt) {
+ case IPA_RECEIVE:
+ skb = (adf_nbuf_t) data;
+ sta_id = skb->data[HDD_IPA_WLAN_HDR_STA_ID_OFFSET];
+ dev_id = skb->data[HDD_IPA_WLAN_HDR_DEV_INFO_OFFSET];
+ adap_dev = hdd_ipa->hdd_ctx->sta_to_adapter[sta_id];
+ skb_pull(skb, HDD_IPA_WLAN_HDR_ONLY_LEN);
+ hdd_ipa->stats.rx_ipa_excep++;
+ hdd_ipa_send_skb_to_network(skb, adap_dev);
+ break;
+ case IPA_WRITE_DONE:
+ done_desc_head = (struct ipa_tx_data_desc *)data;
+ hdd_ipa_w2i_write_done_handler(done_desc_head);
+ break;
+ }
+}
+
+void hdd_ipa_nbuf_cb(adf_nbuf_t skb)
+{
+ ipa_free_skb(skb);
+}
+
+void hdd_ipa_tx_process(adf_nbuf_t skb, uint8_t ac)
+{
+ struct hdd_ipa_priv *hdd_ipa = ghdd_ipa;
+ uint8_t sta_id;
+ hdd_adapter_t *adap_dev;
+
+ skb->queue_mapping = ac;
+ sta_id = skb->data[HDD_IPA_WLAN_HDR_STA_ID_OFFSET];
+ adap_dev = hdd_ipa->hdd_ctx->sta_to_adapter[sta_id];
+ if (!adap_dev
+ || (adap_dev && adap_dev->magic != WLAN_HDD_ADAPTER_MAGIC)) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "Invalid sta_id %d", sta_id);
+ ipa_free_skb(skb);
+ return;
+ }
+ skb->dev = adap_dev->dev;
+ NBUF_OWNER_ID(skb) = IPA_NBUF_OWNER_ID;
+ NBUF_CALLBACK_FN(skb) = hdd_ipa_nbuf_cb;
+ skb_pull(skb, HDD_IPA_WLAN_HDR_ONLY_LEN);
+ (adap_dev->dev->netdev_ops->ndo_start_xmit)(skb, adap_dev->dev);
+}
+
+void hdd_ipa_i2w_cb(void *priv, enum ipa_dp_evt_type evt, unsigned long data)
+{
+ struct hdd_ipa_priv *hdd_ipa = ghdd_ipa;
+ adf_nbuf_t skb;
+ uint8_t client;
+ uint8_t i, ac = HDD_LINUX_AC_BE;
+
+ if (evt == IPA_RECEIVE) {
+ client = *((uint8_t *)priv);
+ skb = (adf_nbuf_t) data;
+ for (i = 0; i < HDD_IPA_MAX_TX_PIPE_MAP; i++) {
+ if (client == hdd_ipa_tx_pipe_map_info[i].client) {
+ ac = hdd_ipa_tx_pipe_map_info[i].ac;
+ break;
+ }
+ }
+ hdd_ipa->stats.tx_ipa_recv++;
+ hdd_ipa_tx_process(skb, ac);
+ } else
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "i2w cb wrong evt: %d", evt);
+}
+
+static int hdd_ipa_setup_sys_pipe(struct hdd_ipa_priv *hdd_ipa)
+{
+ int i, ret = 0;
+ struct ipa_sys_connect_params *ipa;
+
+ /*setup TX pipes */
+ for (i = 0; i < HDD_IPA_RX_PIPE; i++) {
+ ipa = &hdd_ipa->sys_pipe[i].ipa_sys_params;
+
+ ipa->client = hdd_ipa_pipe_client[i];
+ ipa->desc_fifo_sz = hdd_ipa->hdd_ctx->cfg_ini->IpaDescSize;
+ ipa->priv = &hdd_ipa_pipe_client[i];
+ ipa->notify = hdd_ipa_i2w_cb;
+
+ ipa->ipa_ep_cfg.hdr.hdr_len = HDD_IPA_WLAN_HDR_LEN;
+ ipa->ipa_ep_cfg.mode.mode = IPA_BASIC;
+
+ ret = ipa_setup_sys_pipe(ipa, &(hdd_ipa->sys_pipe[i].conn_hdl));
+ if (ret) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "Fail: %d", ret);
+ goto setup_sys_pipe_fail;
+ }
+ hdd_ipa->sys_pipe[i].conn_hdl_valid = 1;
+ }
+
+ ipa = &hdd_ipa->sys_pipe[HDD_IPA_RX_PIPE].ipa_sys_params;
+
+ ipa->client = hdd_ipa_pipe_client[HDD_IPA_RX_PIPE];
+ ipa->desc_fifo_sz = hdd_ipa->hdd_ctx->cfg_ini->IpaDescSize;
+ ipa->priv = &hdd_ipa_pipe_client[HDD_IPA_RX_PIPE];
+ ipa->notify = hdd_ipa_w2i_cb;
+
+ ipa->ipa_ep_cfg.nat.nat_en = IPA_BYPASS_NAT;
+ ipa->ipa_ep_cfg.hdr.hdr_len = HDD_IPA_WLAN_HDR_LEN;
+ ipa->ipa_ep_cfg.hdr.hdr_ofst_metadata_valid = 1;
+ ipa->ipa_ep_cfg.mode.mode = IPA_BASIC;
+
+ ret = ipa_setup_sys_pipe(ipa, &(hdd_ipa->sys_pipe[i].conn_hdl));
+ if (ret) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "Fail: %d", ret);
+ goto setup_sys_pipe_fail;
+ }
+ hdd_ipa->sys_pipe[HDD_IPA_RX_PIPE].conn_hdl_valid = 1;
+
+setup_sys_pipe_fail:
+ return ret;
+}
+
+/* Disconnect all the Sys pipes */
+void hdd_ipa_teardown_sys_pipe(struct hdd_ipa_priv *hdd_ipa)
+{
+ int ret = 0, i;
+ for (i = 0; i < HDD_IPA_MAX_PIPE; i++) {
+ if (hdd_ipa->sys_pipe[i].conn_hdl_valid) {
+ ret = ipa_teardown_sys_pipe(
+ hdd_ipa->sys_pipe[i].conn_hdl);
+ if (ret)
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "fail: %d",
+ ret);
+
+ hdd_ipa->sys_pipe[i].conn_hdl_valid = 0;
+ }
+ }
+}
+
+int hdd_ipa_register_interface(struct hdd_ipa_priv *hdd_ipa, uint8_t iftype,
+ uint8_t sta_id, const char *ifname)
+{
+#define HDD_IPA_TOS_MASK 0xE0
+ struct ipa_tx_intf tx_intf;
+ struct ipa_rx_intf rx_intf;
+ struct ipa_ioc_tx_intf_prop *tx_prop = NULL;
+ struct ipa_ioc_rx_intf_prop *rx_prop = NULL;
+
+ char ipv4_hdr_name[IPA_RESOURCE_NAME_MAX];
+ char ipv6_hdr_name[IPA_RESOURCE_NAME_MAX];
+
+ int i, j, ip_max = HDD_IPA_IPV4;
+ int ret = 0;
+
+ if (hdd_ipa_is_ipv6_enabled(hdd_ipa))
+ ip_max = HDD_IPA_IPV6;
+
+ /* Allocate TX properties for TOS categories, 1 each for IPv4 & IPv6 */
+ tx_prop = hdd_ipa_kzalloc(sizeof(struct ipa_ioc_tx_intf_prop) *
+ HDD_IPA_MAX_TX_PIPE_MAP * ip_max);
+ if (!tx_prop) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "ENOMEM");
+ goto register_interface_fail;
+ }
+
+ /* Allocate RX properties, 1 each for IPv4 & IPv6 */
+ rx_prop = hdd_ipa_kzalloc(sizeof(struct ipa_ioc_rx_intf_prop)
+ * ip_max);
+ if (!rx_prop) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "ENOMEM");
+ goto register_interface_fail;
+ }
+ vos_mem_zero(&tx_intf, sizeof(tx_intf));
+ vos_mem_zero(&rx_intf, sizeof(rx_intf));
+
+ snprintf(ipv4_hdr_name, IPA_RESOURCE_NAME_MAX, "%s%s",
+ ifname, HDD_IPA_IPV4_NAME_EXT);
+ rx_prop[IPA_IP_v4].ip = IPA_IP_v4;
+ if (hdd_ipa_is_ipv6_enabled(hdd_ipa)) {
+ snprintf(ipv6_hdr_name, IPA_RESOURCE_NAME_MAX, "%s%s",
+ ifname, HDD_IPA_IPV6_NAME_EXT);
+ rx_prop[IPA_IP_v6].ip = IPA_IP_v6;
+ }
+ /*
+ TOS value: 1, 2 - > Maps to BK pipe [WLAN1_CONS]
+ TOS value: 0, 3 - > Maps to BE pipe [WLAN2_CONS]
+ TOS value: 4, 5 - > Maps to VI pipe [WLAN3_CONS]
+ TOS Value: 6, 7 - > Maps to VO pipe [WLAN4_CONS]
+ */
+
+ /*
+ IP-TOS - 8bits
+ : DSCP(6-bits) ECN(2-bits)
+ : DSCP - P2 P1 P0 X X X
+ where (P2 P1 P0) form 802.1D
+ So shifting tos_value by 5 bits before passing to IPA. Also IPA
+ required mask to be set for 3 MSB bits.
+ */
+
+ for (i = 0; i < HDD_IPA_MAX_TX_PIPE_MAP; i++) {
+ tx_prop[i].ip = IPA_IP_v4;
+ tx_prop[i].attrib.attrib_mask = IPA_FLT_TOS_MASKED;
+ tx_prop[i].attrib.tos_value =
+ hdd_ipa_tx_pipe_map_info[i].tos_value << 5;
+ tx_prop[i].attrib.tos_mask = HDD_IPA_TOS_MASK;
+ tx_prop[i].dst_pipe = hdd_ipa_tx_pipe_map_info[i].client;
+ strlcpy(tx_prop[i].hdr_name, ipv4_hdr_name,
+ IPA_RESOURCE_NAME_MAX);
+ tx_intf.num_props++;
+ if (hdd_ipa_is_ipv6_enabled(hdd_ipa)) {
+ j = i + HDD_IPA_MAX_TX_PIPE_MAP;
+
+ tx_prop[j].ip = IPA_IP_v6;
+ tx_prop[j].attrib.attrib_mask = IPA_FLT_TOS_MASKED;
+ tx_prop[j].attrib.tos_value =
+ hdd_ipa_tx_pipe_map_info[i].tos_value << 5;
+ tx_prop[j].attrib.tos_mask = HDD_IPA_TOS_MASK;
+ tx_prop[j].dst_pipe =
+ hdd_ipa_tx_pipe_map_info[i].client;
+ strlcpy(tx_prop[j].hdr_name, ipv6_hdr_name,
+ IPA_RESOURCE_NAME_MAX);
+ tx_intf.num_props++;
+ }
+ }
+
+ for (i = 0; i < ip_max; i++) {
+ rx_prop[i].attrib.attrib_mask = IPA_FLT_META_DATA;
+ if (iftype == NL80211_IFTYPE_AP ||
+ iftype == NL80211_IFTYPE_P2P_GO) {
+ rx_prop[i].attrib.meta_data =
+ HDD_IPA_WLAN_HDR_DEV_TYPE_AP
+ << ((HDD_IPA_WLAN_HDR_DEV_INFO_OFFSET-1) * 8);
+ } else {
+ rx_prop[i].attrib.meta_data =
+ HDD_IPA_WLAN_HDR_DEV_TYPE_STA
+ << ((HDD_IPA_WLAN_HDR_DEV_INFO_OFFSET-1) * 8);
+ }
+ rx_prop[i].attrib.meta_data_mask =
+ HDD_IPA_WLAN_HDR_DEV_TYPE_MASK
+ << ((HDD_IPA_WLAN_HDR_DEV_INFO_OFFSET-1) * 8);
+ rx_prop[i].src_pipe = IPA_CLIENT_WLAN1_PROD;
+
+ rx_intf.num_props++;
+ }
+
+ tx_intf.prop = tx_prop;
+ rx_intf.prop = rx_prop;
+
+ /* Call the ipa api to register interface */
+ ret = ipa_register_intf(ifname, &tx_intf, &rx_intf);
+
+register_interface_fail:
+ adf_os_mem_free(tx_prop);
+ adf_os_mem_free(rx_prop);
+ return ret;
+}
+
+static int hdd_ipa_add_header_info(uint8_t sta_id, uint8_t *mac_addr)
+{
+ struct hdd_ipa_priv *hdd_ipa = ghdd_ipa;
+ uint8_t dev_id, wlan_iftype;
+ char *ifname;
+ struct ipa_ioc_add_hdr *ipahdr = NULL;
+ int ret = -EINVAL;
+ hdd_adapter_t *adap_dev;
+
+ adap_dev = hdd_ipa->hdd_ctx->sta_to_adapter[sta_id];
+ if (!adap_dev) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "adap_dev NULL");
+ goto add_header_info_ctx_fail;
+ }
+
+ dev_id = adap_dev->dev->ifindex;
+ wlan_iftype = adap_dev->wdev.iftype;
+ ifname = adap_dev->dev->name;
+
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "Mode: %d Add Partial hdr: %s, %p\n",
+ wlan_iftype, ifname, mac_addr);
+ if (ifname == NULL) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "ifname NULL");
+ goto add_header_info_ctx_fail;
+ }
+
+ /* dynamically allocate the memory to add the hdrs */
+ ipahdr = hdd_ipa_kzalloc(sizeof(struct ipa_ioc_add_hdr) +
+ sizeof(struct ipa_hdr_add));
+ if (!ipahdr) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "%s: ENOMEM", ifname);
+ return -ENOMEM;
+ }
+
+ ipahdr->commit = 0;
+ ipahdr->num_hdrs = 1;
+ /* Set the Source MAC */
+ memcpy(ipahdr->hdr[0].hdr, ipa_set_hdr, HDD_IPA_WLAN_HDR_LEN);
+ memcpy(&ipahdr->hdr[0].hdr[HDD_IPA_WLAN_HDR_SRC_MAC_OFFSET], mac_addr,
+ ETH_ALEN);
+
+ /* Check the interface is AP OR STA mode, and set the station ID */
+ ipahdr->hdr[0].hdr[HDD_IPA_WLAN_HDR_DEV_INFO_OFFSET] |=
+ dev_id & HDD_IPA_WLAN_HDR_DEV_ID_MASK;
+ ipahdr->hdr[0].hdr[HDD_IPA_WLAN_HDR_STA_ID_OFFSET] = sta_id;
+ if (wlan_iftype == NL80211_IFTYPE_AP ||
+ wlan_iftype == NL80211_IFTYPE_P2P_GO) {
+ ipahdr->hdr[0].hdr[HDD_IPA_WLAN_HDR_DEV_INFO_OFFSET] |=
+ HDD_IPA_WLAN_HDR_DEV_TYPE_AP;
+ } else {
+ ipahdr->hdr[0].hdr[HDD_IPA_WLAN_HDR_DEV_INFO_OFFSET] |=
+ HDD_IPA_WLAN_HDR_DEV_TYPE_STA;
+ }
+
+ snprintf(ipahdr->hdr[0].name, IPA_RESOURCE_NAME_MAX, "%s%s",
+ ifname, HDD_IPA_IPV4_NAME_EXT);
+ ipahdr->hdr[0].hdr_len = HDD_IPA_WLAN_HDR_LEN;
+ ipahdr->hdr[0].is_partial = HDD_IPA_WLAN_HDR_PARTIAL;
+ ipahdr->hdr[0].hdr_hdl = 0;
+
+ ret = ipa_add_hdr(ipahdr);
+
+ if (ret) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "%s IPv4 fail: %d", ifname
+ , ret);
+ goto add_header_info_fail;
+ }
+
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "%s: IPv4 hdr_hdl: %x",
+ ipahdr->hdr[0].name, ipahdr->hdr[0].hdr_hdl);
+ if (hdd_ipa_is_ipv6_enabled(hdd_ipa)) {
+ snprintf(ipahdr->hdr[0].name, IPA_RESOURCE_NAME_MAX, "%s%s",
+ ifname, HDD_IPA_IPV6_NAME_EXT);
+ /* Set the type to IPV6 in the header*/
+ ipahdr->hdr[0].hdr[HDD_IPA_WLAN_HDR_IP_VER_OFFSET] = 0x86;
+ ipahdr->hdr[0].hdr[HDD_IPA_WLAN_HDR_IP_VER_OFFSET + 1] = 0xdd;
+
+ ret = ipa_add_hdr(ipahdr);
+ if (ret) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO,
+ "%s: IPv6 hdr fail: %d", ifname, ret);
+ goto add_header_info_fail;
+ }
+
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "%s: IPv6 hdr_hdl: %x",
+ ipahdr->hdr[0].name, ipahdr->hdr[0].hdr_hdl);
+ }
+ /* Configure the TX and RX pipes filter rules */
+ ret = hdd_ipa_register_interface(hdd_ipa, wlan_iftype, sta_id, ifname);
+
+add_header_info_fail:
+ adf_os_mem_free(ipahdr);
+add_header_info_ctx_fail:
+ return ret;
+}
+
+void hdd_remove_ipa_header(char *name)
+{
+ struct ipa_ioc_get_hdr hdrlookup;
+ int ret = 0, len;
+ struct ipa_ioc_del_hdr *ipahdr;
+
+ vos_mem_zero(&hdrlookup, sizeof(hdrlookup));
+ strlcpy(hdrlookup.name, name, sizeof(hdrlookup.name));
+ ret = ipa_get_hdr(&hdrlookup);
+ if (ret) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "Hdr deleted already %s, %d",
+ name, ret);
+ return;
+ }
+
+
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "hdl: %x", hdrlookup.hdl);
+ len = sizeof(struct ipa_ioc_del_hdr) + sizeof(struct ipa_hdr_del)*1;
+ ipahdr = (struct ipa_ioc_del_hdr *) hdd_ipa_kzalloc(len);
+ if (ipahdr == NULL) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "ENOMEM");
+ return;
+ }
+ ipahdr->num_hdls = 1;
+ ipahdr->commit = 0;
+ ipahdr->hdl[0].hdl = hdrlookup.hdl;
+ ipahdr->hdl[0].status = -1;
+ ret = ipa_del_hdr(ipahdr);
+ if (ret != 0)
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "Fail: %d", ret);
+
+ adf_os_mem_free(ipahdr);
+}
+
+void hdd_ipa_clean_hdr(hdd_adapter_t *adap_dev, uint8_t sta_id)
+{
+ struct hdd_ipa_priv *hdd_ipa = ghdd_ipa;
+ int ret;
+ char name_ipa[IPA_RESOURCE_NAME_MAX];
+
+ /* Remove the headers */
+ snprintf(name_ipa, IPA_RESOURCE_NAME_MAX, "%s%s",
+ adap_dev->dev->name, HDD_IPA_IPV4_NAME_EXT);
+ hdd_remove_ipa_header(name_ipa);
+
+ if (hdd_ipa_is_ipv6_enabled(hdd_ipa)) {
+ snprintf(name_ipa, IPA_RESOURCE_NAME_MAX, "%s%s",
+ adap_dev->dev->name, HDD_IPA_IPV6_NAME_EXT);
+ hdd_remove_ipa_header(name_ipa);
+ }
+ /* unregister the interface with IPA */
+ ret = ipa_deregister_intf(adap_dev->dev->name);
+ if (ret)
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO,
+ "%s: ipa_deregister_intf fail: %d", adap_dev->dev->name, ret);
+}
+
+
+static void hdd_ipa_msg_free_fn(void *buff, uint32_t len, uint32_t type)
+{
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "msg type:%d, len:%d\n", type, len);
+ adf_os_mem_free(buff);
+}
+
+int hdd_ipa_wlan_evt(void *Adapter, uint8_t sta_id,
+ enum ipa_wlan_event type, uint8_t *mac_addr)
+{
+ hdd_adapter_t *adap_dev = Adapter;
+ struct ipa_msg_meta meta;
+ struct ipa_wlan_msg *msg;
+ struct ipa_wlan_msg_ex *msg_ex = NULL;
+ int ret;
+ const char *hdd_ipa_event_name[IPA_EVENT_MAX] = {
+ __stringify(WLAN_CLIENT_CONNECT),
+ __stringify(WLAN_CLIENT_DISCONNECT),
+ __stringify(WLAN_CLIENT_POWER_SAVE_MODE),
+ __stringify(WLAN_CLIENT_NORMAL_MODE),
+ __stringify(SW_ROUTING_ENABLE),
+ __stringify(SW_ROUTING_DISABLE),
+ __stringify(WLAN_AP_CONNECT),
+ __stringify(WLAN_AP_DISCONNECT),
+ __stringify(WLAN_STA_CONNECT),
+ __stringify(WLAN_STA_DISCONNECT),
+ __stringify(WLAN_CLIENT_CONNECT_EX),
+ };
+
+
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "%s: %s evt, MAC: %pM sta_id: %d",
+ adap_dev->dev->name, hdd_ipa_event_name[type],
+ mac_addr, sta_id);
+ if (type >= IPA_EVENT_MAX)
+ return -EINVAL;
+
+ if (WARN_ON(is_zero_ether_addr(mac_addr)))
+ return -EINVAL;
+
+ switch (type) {
+ case WLAN_STA_CONNECT:
+ case WLAN_AP_CONNECT:
+ hdd_ipa_add_header_info(sta_id, mac_addr);
+ break;
+
+ case WLAN_STA_DISCONNECT:
+ case WLAN_AP_DISCONNECT:
+ hdd_ipa_clean_hdr(adap_dev, sta_id);
+ break;
+
+ case WLAN_CLIENT_CONNECT_EX:
+ meta.msg_type = type;
+ meta.msg_len = (sizeof(struct ipa_wlan_msg_ex) +
+ sizeof(struct ipa_wlan_hdr_attrib_val) * 2);
+ msg_ex = hdd_ipa_kzalloc (meta.msg_len);
+ if (msg_ex == NULL) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "ENOMEM");
+ return -ENOMEM;
+ }
+ strlcpy(msg_ex->name, adap_dev->dev->name, IPA_RESOURCE_NAME_MAX);
+ msg_ex->num_of_attribs = 2;
+ msg_ex->attribs[0].attrib_type = WLAN_HDR_ATTRIB_MAC_ADDR;
+ msg_ex->attribs[0].offset = HDD_IPA_WLAN_HDR_DES_MAC_OFFSET;
+ memcpy(msg_ex->attribs[0].u.mac_addr, mac_addr,
+ IPA_MAC_ADDR_SIZE);
+
+ msg_ex->attribs[1].attrib_type = WLAN_HDR_ATTRIB_STA_ID;
+ msg_ex->attribs[1].offset = HDD_IPA_WLAN_HDR_STA_ID_OFFSET;
+ msg_ex->attribs[1].u.sta_id = sta_id;
+ ret = ipa_send_msg(&meta, msg_ex, hdd_ipa_msg_free_fn);
+
+ if (ret) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "%s: Evt: %d : %d",
+ msg_ex->name, meta.msg_type, ret);
+ adf_os_mem_free(msg_ex);
+ return ret;
+ }
+ return 0;
+ case WLAN_CLIENT_DISCONNECT:
+ break;
+
+ default:
+ return 0;
+ }
+
+ meta.msg_len = sizeof(struct ipa_wlan_msg);
+ msg = hdd_ipa_kzalloc(meta.msg_len);
+ if (msg == NULL) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "ENOMEM");
+ return -ENOMEM;
+ }
+
+ meta.msg_type = type;
+ strlcpy(msg->name, adap_dev->dev->name, IPA_RESOURCE_NAME_MAX);
+ memcpy(msg->mac_addr, mac_addr, ETH_ALEN);
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "%s: Evt: %d",
+ msg->name, meta.msg_type);
+ ret = ipa_send_msg(&meta, msg, hdd_ipa_msg_free_fn);
+
+ if (ret) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO, "%s: Evt: %d fail:%d",
+ msg->name, meta.msg_type, ret);
+ adf_os_mem_free(msg);
+ return ret;
+ }
+
+ return ret;
+}
+
+
+static int hdd_ipa_rx_pipe_desc_alloc(void)
+{
+ struct hdd_ipa_priv *hdd_ipa = ghdd_ipa;
+ uint32_t i, max_desc_cnt;
+ int ret =0;
+ struct ipa_tx_data_desc *tmp_desc;
+
+ hdd_ipa->hw_desc_cnt = IPA_NUM_OF_FIFO_DESC(
+ hdd_ipa->hdd_ctx->cfg_ini->IpaDescSize);
+ max_desc_cnt = hdd_ipa->hw_desc_cnt * HDD_IPA_DESC_BUFFER_RATIO;
+
+ spin_lock_init(&hdd_ipa->q_lock);
+ spin_lock_bh(&hdd_ipa->q_lock);
+ INIT_LIST_HEAD(&hdd_ipa->free_desc_head);
+ INIT_LIST_HEAD(&hdd_ipa->pend_desc_head);
+ hdd_ipa->stats.freeq_cnt = max_desc_cnt;
+ for (i = 0; i < max_desc_cnt; i++) {
+ tmp_desc = hdd_ipa_kzalloc(sizeof(struct
+ ipa_tx_data_desc));
+ if (!tmp_desc) {
+ ret = -1;
+ break;
+ }
+ list_add_tail(&tmp_desc->link, &hdd_ipa->free_desc_head);
+ }
+ spin_unlock_bh(&hdd_ipa->q_lock);
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_INFO,
+ "Desc sz:%d h_desc_cnt:%d freeq_cnt:%llu",
+ hdd_ipa->hdd_ctx->cfg_ini->IpaDescSize, hdd_ipa->hw_desc_cnt,
+ hdd_ipa->stats.freeq_cnt);
+ return ret;
+}
+
+static void hdd_ipa_rx_pipe_desc_free(void)
+{
+ struct hdd_ipa_priv *hdd_ipa = ghdd_ipa;
+ uint32_t i = 0, max_desc_cnt;
+ struct ipa_tx_data_desc *desc, *tmp;
+
+ max_desc_cnt = hdd_ipa->hw_desc_cnt * HDD_IPA_DESC_BUFFER_RATIO;
+
+ spin_lock_bh(&hdd_ipa->q_lock);
+ list_for_each_entry_safe(desc, tmp, &hdd_ipa->free_desc_head, link) {
+ list_del(&desc->link);
+ adf_os_mem_free(desc);
+ i++;
+ }
+ spin_unlock_bh(&hdd_ipa->q_lock);
+
+ if (i != max_desc_cnt)
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_FATAL, "free mem leak");
+
+}
+
+static ssize_t hdd_ipa_debugfs_read_ipa_stats(struct file *file,
+ char __user *user_buf, size_t count, loff_t *ppos)
+{
+ struct hdd_ipa_priv *hdd_ipa = file->private_data;
+ char *buf;
+ unsigned int len = 0, buf_len = 1500;
+ ssize_t ret_cnt;
+
+ buf = kzalloc(buf_len, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
+ len += scnprintf(buf + len, buf_len - len, "\n");
+ len += scnprintf(buf + len, buf_len - len, "%25s\n",
+ "IPA stats");
+ len += scnprintf(buf + len, buf_len - len, "%25s\n\n",
+ "===========");
+
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "RM Grants: ", hdd_ipa->stats.rm_grant);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "RM Releases: ", hdd_ipa->stats.rm_release);
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "IPA RM Qued:", hdd_ipa->stats.rx_ipa_rm_qued);
+#endif
+ len += scnprintf(buf + len, buf_len - len, "%20s %10u\n\n",
+ "Pending cnt:", hdd_ipa->pending_desc_cnt);
+
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "IPA HW Max Qued:", hdd_ipa->stats.rx_ipa_hw_max_qued);
+#endif
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n\n",
+ "IPA HW Maxed out", hdd_ipa->stats.rx_ipa_hw_maxed_out);
+
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "IPA RX Prefilter: ", hdd_ipa->stats.prefilter);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "IPA RX send cnt:", hdd_ipa->stats.rx_ipa_sent_desc_cnt);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "IPA RX Write done:", hdd_ipa->stats.rx_ipa_write_done);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "IPA RX Exception: ", hdd_ipa->stats.rx_ipa_excep);
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "RXT recv:", hdd_ipa->stats.rxt_recv);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "RXT drop:", hdd_ipa->stats.rxt_drop);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "RXT desc drop:", hdd_ipa->stats.rxt_d_drop);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "RXT desc head drop:", hdd_ipa->stats.rxt_dh_drop);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "DH sent:", hdd_ipa->stats.rx_ipa_dh_sent);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "DH reclaim:", hdd_ipa->stats.rx_ipa_dh_reclaim);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "DH not used:", hdd_ipa->stats.rx_ipa_dh_not_used);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "RXT 0 skb:", hdd_ipa->stats.rxt_0);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "RXT 1 skb:", hdd_ipa->stats.rxt_1);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "RXT 2 skb:", hdd_ipa->stats.rxt_2);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "RXT 3 skb:", hdd_ipa->stats.rxt_3);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "RXT 4 skb:", hdd_ipa->stats.rxt_4);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "RXT 5 skb:", hdd_ipa->stats.rxt_5);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n\n",
+ "RXT > 5 skb:", hdd_ipa->stats.rxt_6);
+#endif
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n\n",
+ "IPA TX Recieve:", hdd_ipa->stats.tx_ipa_recv);
+
+#ifdef HDD_IPA_EXTRA_DP_COUNTERS
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "Free Queue use:", hdd_ipa->stats.freeq_use);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "Free Queue reclaim:", hdd_ipa->stats.freeq_reclaim);
+#endif
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n",
+ "Free Queue Empty:", hdd_ipa->stats.freeq_empty);
+ len += scnprintf(buf + len, buf_len - len, "%20s %10llu\n\n",
+ "Free Queue cnt:", hdd_ipa->stats.freeq_cnt);
+
+
+ if (len > buf_len)
+ len = buf_len;
+
+ ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len);
+ kfree(buf);
+ return ret_cnt;
+}
+
+static const struct file_operations fops_ipa_stats = {
+ .read = hdd_ipa_debugfs_read_ipa_stats,
+ .open = simple_open,
+ .owner = THIS_MODULE,
+ .llseek = default_llseek,
+};
+
+
+int hdd_ipa_debugfs_init(struct hdd_ipa_priv *hdd_ipa)
+{
+#ifdef WLAN_OPEN_SOURCE
+ hdd_ipa->debugfs_dir = debugfs_create_dir("cld",
+ hdd_ipa->hdd_ctx->wiphy->debugfsdir);
+ if(!hdd_ipa->debugfs_dir)
+ return -ENOMEM;
+
+ debugfs_create_file("ipa-stats", S_IRUSR, hdd_ipa->debugfs_dir,
+ hdd_ipa, &fops_ipa_stats);
+#endif
+ return 0;
+}
+
+/**
+* hdd_ipa_init() - Allocate hdd_ipa resources, ipa pipe resource and register
+* wlan interface with IPA module.
+* @param
+* hdd_ctx : [in] pointer to HDD context
+* @return : VOS_STATUS_E_FAILURE - Errors
+* : VOS_STATUS_SUCCESS - Ok
+*/
+VOS_STATUS hdd_ipa_init(hdd_context_t *hdd_ctx)
+{
+ struct hdd_ipa_priv *hdd_ipa = NULL;
+ int ret;
+ if (!hdd_ipa_is_enabled(hdd_ctx))
+ return 0;
+
+ hdd_ipa = hdd_ipa_kzalloc(sizeof(struct hdd_ipa_priv));
+ if (!hdd_ipa) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_FATAL, "ENOMEM");
+ goto fail_setup_rm;
+ }
+ hdd_ctx->hdd_ipa = hdd_ipa;
+ ghdd_ipa = hdd_ipa;
+ hdd_ipa->hdd_ctx = hdd_ctx;
+
+ ret = hdd_ipa_setup_rm(hdd_ipa);
+ if (ret)
+ goto fail_setup_rm;
+
+ ret = hdd_ipa_setup_sys_pipe(hdd_ipa);
+ if (ret)
+ goto fail_create_sys_pipe;
+
+ atomic_set(&hdd_ipa->rm_state, HDD_IPA_RM_RELEASED);
+
+ ret = hdd_ipa_rx_pipe_desc_alloc();
+ if (ret)
+ goto fail_alloc_rx_pipe_desc;
+
+ ret = hdd_ipa_debugfs_init(hdd_ipa);
+ if (ret)
+ goto fail_alloc_rx_pipe_desc;
+
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_FATAL, "IPA Init Done");
+#ifndef HDD_IPA_USE_IPA_RM_TIMER
+ setup_timer(&hdd_ipa->rm_timer, hdd_ipa_rm_timer_handler,
+ (unsigned long) &hdd_ipa);
+#endif
+ return VOS_STATUS_SUCCESS;
+fail_alloc_rx_pipe_desc:
+ hdd_ipa_rx_pipe_desc_free();
+fail_create_sys_pipe:
+ hdd_ipa_destory_rm_resource(hdd_ipa);
+fail_setup_rm:
+ return VOS_STATUS_E_FAILURE;
+}
+
+VOS_STATUS hdd_ipa_cleanup(hdd_context_t *hdd_ctx)
+{
+ struct hdd_ipa_priv *hdd_ipa = hdd_ctx->hdd_ipa;
+
+ if (!hdd_ipa_is_enabled(hdd_ctx))
+ return VOS_STATUS_SUCCESS;
+
+#ifndef HDD_IPA_USE_IPA_RM_TIMER
+ del_timer(&hdd_ipa->rm_timer);
+#endif
+ if (hdd_ipa->pending_desc_cnt != 0) {
+ msleep(5);
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_FATAL, "IPA Pending");
+ }
+ hdd_ipa_rx_pipe_desc_free();
+ hdd_ipa_teardown_sys_pipe(hdd_ipa);
+ hdd_ipa_destory_rm_resource(hdd_ipa);
+
+ adf_os_mem_free(hdd_ctx->hdd_ipa);
+
+ return VOS_STATUS_SUCCESS;
+}
+
+#endif
+
+
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 23e04374639b..0a4fcff7999a 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -111,6 +111,9 @@ void hdd_ch_avoid_cb(void *hdd_context,void *indi_param);
#endif /* FEATURE_WLAN_CH_AVOID */
#include "wlan_hdd_debugfs.h"
+#ifdef IPA_OFFLOAD
+#include <wlan_hdd_ipa.h>
+#endif
#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC)
#include "if_pci.h"
#endif
@@ -7980,6 +7983,9 @@ void hdd_wlan_exit(hdd_context_t *pHddCtx)
hdd_close_all_adapters( pHddCtx );
+#ifdef IPA_OFFLOAD
+ hdd_ipa_cleanup(pHddCtx);
+#endif
//Free up dynamically allocated members inside HDD Adapter
kfree(pHddCtx->cfg_ini);
@@ -9166,6 +9172,10 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc)
{
hdd_set_idle_ps_config(pHddCtx, TRUE);
}
+#ifdef IPA_OFFLOAD
+ if (hdd_ipa_init(pHddCtx) == VOS_STATUS_E_FAILURE)
+ goto err_nl_srv;
+#endif
#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC)
complete(&wlan_start_comp);
diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
index a04d129165f7..e909b2d69f33 100644
--- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
@@ -48,7 +48,9 @@
#include <halTypes.h>
#include <net/ieee80211_radiotap.h>
-
+#ifdef IPA_OFFLOAD
+#include <wlan_hdd_ipa.h>
+#endif
/*---------------------------------------------------------------------------
Preprocessor definitions and constants
-------------------------------------------------------------------------*/
@@ -522,6 +524,9 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
//Get TL AC corresponding to Qdisc queue index/AC.
ac = hdd_QdiscAcToTlAC[skb->queue_mapping];
+#if defined (IPA_OFFLOAD)
+ if(!(NBUF_OWNER_ID(skb) == IPA_NBUF_OWNER_ID)) {
+#endif
// Check if the buffer has enough header room
skb = skb_unshare(skb, GFP_ATOMIC);
if (!skb)
@@ -535,6 +540,9 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
if (!skb)
goto drop_pkt;
}
+#if defined (IPA_OFFLOAD)
+ }
+#endif
if (WLANTL_SendSTA_DataFrame((WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
STAId, skb) != NULL) {
@@ -1799,11 +1807,21 @@ VOS_STATUS hdd_softap_RegisterSTA( hdd_adapter_t *pAdapter,
staDesc.ucIsReplayCheckValid = VOS_FALSE;
// Register the Station with TL...
+#ifdef IPA_OFFLOAD
+ if (hdd_ipa_is_enabled(pHddCtx)) {
+ vosStatus = WLANTL_RegisterSTAClient( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
+ hdd_ipa_process_rxt,
+ hdd_softap_tx_complete_cbk,
+ hdd_softap_tx_fetch_packet_cbk, &staDesc, 0 );
+ } else {
+#endif
vosStatus = WLANTL_RegisterSTAClient( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
hdd_softap_rx_packet_cbk,
hdd_softap_tx_complete_cbk,
hdd_softap_tx_fetch_packet_cbk, &staDesc, 0 );
-
+#ifdef IPA_OFFLOAD
+ }
+#endif
if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
{
VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_ERROR,
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index 057d619dc211..f57be8db267c 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -52,6 +52,10 @@
#include "wlan_hdd_tdls.h"
#endif
+#ifdef IPA_OFFLOAD
+#include <wlan_hdd_ipa.h>
+#endif
+
/*---------------------------------------------------------------------------
Preprocessor definitions and constants
-------------------------------------------------------------------------*/
@@ -864,6 +868,10 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
//Get TL AC corresponding to Qdisc queue index/AC.
ac = hdd_QdiscAcToTlAC[skb->queue_mapping];
+#ifdef IPA_OFFLOAD
+ if(!(NBUF_OWNER_ID(skb) == IPA_NBUF_OWNER_ID)) {
+#endif
+
/* Check if the buffer has enough header room */
skb = skb_unshare(skb, GFP_ATOMIC);
if (!skb)
@@ -877,7 +885,9 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
if (!skb)
goto drop_pkt;
}
-
+#ifdef IPA_OFFLOAD
+ }
+#endif
//user priority from IP header, which is already extracted and set from
//select_queue call back function
up = skb->priority;
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.c b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
index 257de52c6c10..7a72cb10aa10 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.c
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
@@ -102,6 +102,11 @@ __adf_nbuf_alloc(adf_os_device_t osdev, size_t size, int reserve, int align, int
void
__adf_nbuf_free(struct sk_buff *skb)
{
+#ifdef IPA_OFFLOAD
+ if( (NBUF_OWNER_ID(skb) == IPA_NBUF_OWNER_ID) && NBUF_CALLBACK_FN(skb) )
+ NBUF_CALLBACK_FN_EXEC(skb);
+ else
+#endif
dev_kfree_skb_any(skb);
}
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
index 2bfac4ef84ef..3b86ebf594c8 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
@@ -44,6 +44,9 @@
#include <adf_net_types.h>
#include <adf_nbuf_pvt.h>
+#ifdef IPA_OFFLOAD
+#define IPA_NBUF_OWNER_ID 0xaa55aa55
+#endif
/**
* @brief Platform indepedent packet abstraction
*/
diff --git a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
index e553c86b95ac..d209ded62380 100644
--- a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
+++ b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
@@ -48,6 +48,7 @@
*/
typedef struct sk_buff * __adf_nbuf_t;
+typedef void (*__adf_nbuf_callback_fn) (struct sk_buff *skb);
#define OSDEP_EAPOL_TID 6 /* send it on VO queue */
/* CVG_NBUF_MAX_OS_FRAGS -
@@ -101,7 +102,15 @@ struct cvg_nbuf_cb {
*/
wordstream_flags : CVG_NBUF_MAX_EXTRA_FRAGS+1;
} extra_frags;
+ uint32_t owner_id;
+ __adf_nbuf_callback_fn adf_nbuf_callback_fn;
};
+#define NBUF_OWNER_ID(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->owner_id)
+#define NBUF_CALLBACK_FN(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->adf_nbuf_callback_fn)
+#define NBUF_CALLBACK_FN_EXEC(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->adf_nbuf_callback_fn)(skb)
#define NBUF_MAPPED_PADDR_LO(skb) \
(((struct cvg_nbuf_cb *)((skb)->cb))->mapped_paddr_lo[0])
#define NBUF_NUM_EXTRA_FRAGS(skb) \
diff --git a/Makefile b/Makefile
index f6192c6b11c3..9583d67159f7 100644
--- a/Makefile
+++ b/Makefile
@@ -1,3 +1,7 @@
+
+KERN_DIR ?= /lib/modules/$(shell uname -r)/build
+-include $(KERN_DIR)/.config
+
# We can build either as part of a standalone Kernel build or part
# of an Android build. Determine which mechanism is being used
#ifeq ($(MODNAME),)
@@ -126,6 +130,11 @@ CONFIG_CHECKSUM_OFFLOAD := 1
CONFIG_GTK_OFFLOAD := 1
endif
+#Enable IPA offload
+ifeq ($(CONFIG_IPA), y)
+CONFIG_IPA_OFFLOAD := 1
+endif
+
ifeq ($(CONFIG_CFG80211),y)
HAVE_CFG80211 := 1
else
@@ -244,6 +253,10 @@ HDD_OBJS := $(HDD_SRC_DIR)/bap_hdd_main.o \
$(HDD_SRC_DIR)/wlan_hdd_wmm.o \
$(HDD_SRC_DIR)/wlan_hdd_wowl.o
+ifeq ($(CONFIG_IPA_OFFLOAD), 1)
+HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_ipa.o
+endif
+
ifeq ($(HAVE_CFG80211),1)
HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_cfg80211.o \
$(HDD_SRC_DIR)/wlan_hdd_p2p.o
@@ -1053,6 +1066,11 @@ ifeq ($(CONFIG_CHECKSUM_OFFLOAD), 1)
CDEFINES += -DCHECKSUM_OFFLOAD
endif
+#Enable Checksum Offload support
+ifeq ($(CONFIG_IPA_OFFLOAD), 1)
+CDEFINES += -DIPA_OFFLOAD -DHDD_IPA_USE_IPA_RM_TIMER
+endif
+
#Enable GTK Offload
ifeq ($(CONFIG_GTK_OFFLOAD), 1)
CDEFINES += -DWLAN_FEATURE_GTK_OFFLOAD
@@ -1074,7 +1092,6 @@ EXTRA_CFLAGS += $(CDEFINES)
obj-m := $(MODNAME).o
wlan-objs := $(OBJS)
-KERN_DIR ?= /lib/modules/$(shell uname -r)/build
PWD = $(shell pwd)
all:
diff --git a/firmware_bin/WCNSS_qcom_cfg.ini b/firmware_bin/WCNSS_qcom_cfg.ini
index 9dbde54e867a..21c3c00794d3 100644
--- a/firmware_bin/WCNSS_qcom_cfg.ini
+++ b/firmware_bin/WCNSS_qcom_cfg.ini
@@ -459,6 +459,12 @@ gEnablefwprint=0
#Enable firmware log
gEnablefwlog=1
+#IPA config
+gIPAEnable=1
+gIPADescSize=800
+gIPAPreFilterEnable=1
+gIPARMEnable=1
+
#P2P Listen offload
gEnableP2pListenOffload=1