Merge "wlan: Update the TDLS cfg80211 interface for 3.18 support"
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 0c789a9..87f3633 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1519,6 +1519,13 @@
#define CFG_OBSS_HT40_SCAN_WIDTH_TRIGGER_INTERVAL_MAX ( 900 )
#define CFG_OBSS_HT40_SCAN_WIDTH_TRIGGER_INTERVAL_DEFAULT ( 200 )
+/* RPS configurations */
+#define CFG_RPS_CPU_MAP_MIN (0)
+#define CFG_RPS_CPU_MAP_MAX (0xff)
+
+#define CFG_RPS_CPU_MAP_NAME "rps_mask"
+#define CFG_RPS_CPU_MAP_DEFAULT (0x00)
+
#define CFG_MULTICAST_HOST_FW_MSGS "gMulticastHostMsgs"
#define CFG_MULTICAST_HOST_FW_MSGS_MIN (0)
#define CFG_MULTICAST_HOST_FW_MSGS_MAX (1)
@@ -3057,6 +3064,7 @@
v_BOOL_t ignorePeerHTopMode;
v_U8_t gOptimizeCAevent;
v_BOOL_t crash_inject_enabled;
+ v_U16_t rps_mask;
} hdd_config_t;
/*---------------------------------------------------------------------------
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h
index c9f2bb2..e0d03c8 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -1008,6 +1008,13 @@
void* wlan_hdd_change_country_code_cb(void *pAdapter);
void hdd_select_cbmode( hdd_adapter_t *pAdapter,v_U8_t operationChannel);
+v_U8_t* wlan_hdd_cfg80211_get_ie_ptr(
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const v_U8_t *pIes,
+#else
+ v_U8_t *pIes,
+#endif
+ int length, v_U8_t eid);
#ifdef FEATURE_WLAN_CH_AVOID
int wlan_hdd_send_avoid_freq_event(hdd_context_t *pHddCtx,
@@ -1021,4 +1028,18 @@
void wlan_hdd_cfg80211_nan_init(hdd_context_t *pHddCtx);
+#if !(defined (SUPPORT_WDEV_CFG80211_VENDOR_EVENT_ALLOC))
+static inline struct sk_buff *
+backported_cfg80211_vendor_event_alloc(struct wiphy *wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ struct wireless_dev *wdev,
+#endif
+ int approxlen,
+ int event_idx, gfp_t gfp)
+{
+ return cfg80211_vendor_event_alloc(wiphy, approxlen, event_idx, gfp);
+}
+#define cfg80211_vendor_event_alloc backported_cfg80211_vendor_event_alloc
+#endif
+
#endif
diff --git a/CORE/HDD/inc/wlan_hdd_p2p.h b/CORE/HDD/inc/wlan_hdd_p2p.h
index b39f5aa..4e733f0 100644
--- a/CORE/HDD/inc/wlan_hdd_p2p.h
+++ b/CORE/HDD/inc/wlan_hdd_p2p.h
@@ -138,7 +138,10 @@
int wlan_hdd_check_remain_on_channel(hdd_adapter_t *pAdapter);
VOS_STATUS wlan_hdd_cancel_existing_remain_on_channel(hdd_adapter_t *pAdapter);
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+int wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
+ struct cfg80211_mgmt_tx_params *params, u64 *cookie);
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
int wlan_hdd_mgmt_tx( struct wiphy *wiphy, struct wireless_dev *wdev,
struct ieee80211_channel *chan, bool offchan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))
diff --git a/CORE/HDD/inc/wlan_hdd_tdls.h b/CORE/HDD/inc/wlan_hdd_tdls.h
index 75a5dc1..35b9091 100644
--- a/CORE/HDD/inc/wlan_hdd_tdls.h
+++ b/CORE/HDD/inc/wlan_hdd_tdls.h
@@ -149,7 +149,12 @@
WIFI_TDLS_FAILED /* Direct link failed */
} tdls_state_t;
-typedef int (*cfg80211_exttdls_callback)(tANI_U8* mac,
+typedef int (*cfg80211_exttdls_callback)(
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tANI_U8* mac,
+#else
+ tANI_U8* mac,
+#endif
tANI_S32 state,
tANI_S32 reason,
void *ctx);
@@ -247,13 +252,25 @@
int wlan_hdd_tdls_set_sta_id(hdd_adapter_t *pAdapter, u8 *mac, u8 staId);
-hddTdlsPeer_t *wlan_hdd_tdls_find_peer(hdd_adapter_t *pAdapter, u8 *mac, tANI_BOOLEAN mutexLock);
+hddTdlsPeer_t *wlan_hdd_tdls_find_peer(hdd_adapter_t *pAdapter,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac,
+#else
+ u8 *mac,
+#endif
+ tANI_BOOLEAN mutexLock);
hddTdlsPeer_t *wlan_hdd_tdls_find_all_peer(hdd_context_t *pHddCtx, u8 *mac);
int wlan_hdd_tdls_get_link_establish_params(hdd_adapter_t *pAdapter, u8 *mac,
tCsrTdlsLinkEstablishParams* tdlsLinkEstablishParams);
-hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter, u8 *mac);
+hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac
+#else
+ u8 *mac
+#endif
+ );
int wlan_hdd_tdls_set_cap(hdd_adapter_t *pAdapter, u8* mac, tTDLSCapType cap);
@@ -261,14 +278,22 @@
tTDLSLinkStatus status,
tTDLSLinkReason reason);
void wlan_hdd_tdls_set_link_status(hdd_adapter_t *pAdapter,
- u8* mac,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac,
+#else
+ u8 *mac,
+#endif
tTDLSLinkStatus linkStatus,
tTDLSLinkReason reason);
int wlan_hdd_tdls_recv_discovery_resp(hdd_adapter_t *pAdapter, u8 *mac);
int wlan_hdd_tdls_set_peer_caps(hdd_adapter_t *pAdapter,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac,
+#else
u8 *mac,
+#endif
tCsrStaParams *StaParams,
tANI_BOOLEAN isBufSta,
tANI_BOOLEAN isOffChannelSupported);
@@ -303,7 +328,12 @@
u8 wlan_hdd_tdls_is_peer_progress(hdd_adapter_t *pAdapter, u8 *mac);
-hddTdlsPeer_t *wlan_hdd_tdls_is_progress(hdd_context_t *pHddCtx, u8* mac,
+hddTdlsPeer_t *wlan_hdd_tdls_is_progress(hdd_context_t *pHddCtx,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac,
+#else
+ u8 *mac,
+#endif
u8 skip_self, tANI_BOOLEAN mutexLock);
void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx,
diff --git a/CORE/HDD/inc/wlan_hdd_wmm.h b/CORE/HDD/inc/wlan_hdd_wmm.h
index bc32a1d..76c2837 100644
--- a/CORE/HDD/inc/wlan_hdd_wmm.h
+++ b/CORE/HDD/inc/wlan_hdd_wmm.h
@@ -264,8 +264,14 @@
@return : Qdisc queue index
===========================================================================*/
-v_U16_t hdd_hostapd_select_queue(struct net_device * dev, struct sk_buff *skb);
-
+v_U16_t hdd_hostapd_select_queue(struct net_device * dev, struct sk_buff *skb
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,13,0))
+ , void *accel_priv
+#endif
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+ , select_queue_fallback_t fallbac
+#endif
+);
/**============================================================================
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index 09fb7d4..cea0050 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -2114,6 +2114,11 @@
if (pRoamInfo->pBssDesc)
{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0))
+ struct ieee80211_channel *chan;
+ int chan_no;
+ unsigned int freq;
+#endif
hdd_ibss_RegisterSTA (pAdapter, pRoamInfo,
IBSS_BROADCAST_STAID,
&broadcastMacAddr, pRoamInfo->pBssDesc);
@@ -2133,8 +2138,28 @@
__func__, pAdapter->dev->name);
return;
}
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0))
+ chan_no = pRoamInfo->pBssDesc->channelId;
+ if (chan_no <= 14)
+ freq = ieee80211_channel_to_frequency(chan_no,
+ IEEE80211_BAND_2GHZ);
+ else
+ freq = ieee80211_channel_to_frequency(chan_no,
+ IEEE80211_BAND_5GHZ);
+
+ chan = ieee80211_get_channel(pAdapter->wdev.wiphy, freq);
+
+ if (chan)
+ cfg80211_ibss_joined(pAdapter->dev, bss->bssid,
+ chan, GFP_KERNEL);
+ else
+ hddLog(LOGE, FL("%s: chanId: %d, can't find channel"),
+ pAdapter->dev->name,
+ (int)pRoamInfo->pBssDesc->channelId);
+#else
cfg80211_ibss_joined(pAdapter->dev, bss->bssid, GFP_KERNEL);
+#endif
cfg80211_put_bss(
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,0))
pHddCtx->wiphy,
@@ -4952,12 +4977,20 @@
/* Get pAdapter from Destination mac address of the frame */
if (type == SIR_MAC_MGMT_FRAME && subType == SIR_MAC_MGMT_DISASSOC)
{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0))
+ cfg80211_rx_unprot_mlme_mgmt(pAdapter->dev, pbFrames, nFrameLength);
+#else
cfg80211_send_unprot_disassoc(pAdapter->dev, pbFrames, nFrameLength);
+#endif
pAdapter->hdd_stats.hddPmfStats.numUnprotDisassocRx++;
}
else if (type == SIR_MAC_MGMT_FRAME && subType == SIR_MAC_MGMT_DEAUTH)
{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0))
+ cfg80211_rx_unprot_mlme_mgmt(pAdapter->dev, pbFrames, nFrameLength);
+#else
cfg80211_send_unprot_deauth(pAdapter->dev, pbFrames, nFrameLength);
+#endif
pAdapter->hdd_stats.hddPmfStats.numUnprotDeauthRx++;
}
else
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 5f5d258..5ba7ffc 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -3402,6 +3402,12 @@
CFG_ENABLE_CRASH_INJECT_MIN,
CFG_ENABLE_CRASH_INJECT_MAX),
+ REG_VARIABLE( CFG_RPS_CPU_MAP_NAME, WLAN_PARAM_HexInteger,
+ hdd_config_t, rps_mask,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_RPS_CPU_MAP_DEFAULT,
+ CFG_RPS_CPU_MAP_MIN,
+ CFG_RPS_CPU_MAP_MAX),
};
/*
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index bea5b1b..4917b7a 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -627,6 +627,9 @@
}
vendor_event = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
sizeof(tHddAvoidFreqList),
QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY_INDEX,
GFP_KERNEL);
@@ -758,6 +761,9 @@
}
vendor_event = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
data->event_data_len +
NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_NAN_INDEX,
@@ -2192,6 +2198,9 @@
return;
}
skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CAPABILITIES_INDEX,
GFP_KERNEL);
@@ -2276,6 +2285,9 @@
}
skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_START_INDEX,
GFP_KERNEL);
@@ -2338,6 +2350,9 @@
}
skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_STOP_INDEX,
GFP_KERNEL);
@@ -2387,6 +2402,9 @@
}
skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_BSSID_HOTLIST_INDEX,
GFP_KERNEL);
@@ -2436,6 +2454,9 @@
}
skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_BSSID_HOTLIST_INDEX,
GFP_KERNEL);
@@ -2485,6 +2506,9 @@
}
skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SIGNIFICANT_CHANGE_INDEX,
GFP_KERNEL);
@@ -2535,6 +2559,9 @@
}
skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SIGNIFICANT_CHANGE_INDEX,
GFP_KERNEL);
@@ -2596,6 +2623,9 @@
totalResults -= EXTSCAN_MAX_CACHED_RESULTS_PER_IND;
skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CACHED_RESULTS_INDEX,
GFP_KERNEL);
@@ -2750,6 +2780,9 @@
}
skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_AP_FOUND_INDEX,
GFP_KERNEL);
@@ -2870,6 +2903,9 @@
}
skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTSCAN_EVENT_BUF_SIZE,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SIGNIFICANT_CHANGE_INDEX,
GFP_KERNEL);
@@ -2973,6 +3009,9 @@
}
skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_FULL_SCAN_RESULT_INDEX,
GFP_KERNEL);
@@ -3072,6 +3111,9 @@
}
skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_RESULTS_AVAILABLE_INDEX,
GFP_KERNEL);
@@ -3123,6 +3165,9 @@
}
skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_EVENT_INDEX,
GFP_KERNEL);
@@ -4527,7 +4572,12 @@
return ret;
}
-static int wlan_hdd_cfg80211_exttdls_callback(tANI_U8* mac,
+static int wlan_hdd_cfg80211_exttdls_callback(
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tANI_U8* mac,
+#else
+ tANI_U8* mac,
+#endif
tANI_S32 state,
tANI_S32 reason,
void *ctx)
@@ -4555,8 +4605,10 @@
hddLog(VOS_TRACE_LEVEL_ERROR, FL("TDLS external control is disabled"));
return -ENOTSUPP;
}
- skb = cfg80211_vendor_event_alloc(
- pHddCtx->wiphy,
+ skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ NULL,
+#endif
EXTTDLS_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_TDLS_STATE_CHANGE_INDEX,
GFP_KERNEL);
@@ -5652,8 +5704,11 @@
/* This will disable updating of NL channels from passive to
* active if a beacon is received on passive channel. */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+ wiphy->regulatory_flags |= REGULATORY_DISABLE_BEACON_HINTS;
+#else
wiphy->flags |= WIPHY_FLAG_DISABLE_BEACON_HINTS;
-
+#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0))
@@ -5661,7 +5716,11 @@
| WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD
| WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL
| WIPHY_FLAG_OFFCHAN_TX;
- wiphy->country_ie_pref = NL80211_COUNTRY_IE_IGNORE_CORE;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+ wiphy->regulatory_flags = REGULATORY_COUNTRY_IE_IGNORE;
+#else
+ wiphy->country_ie_pref = NL80211_COUNTRY_IE_IGNORE_CORE;
+#endif
#endif
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
@@ -6163,10 +6222,16 @@
}
-v_U8_t* wlan_hdd_cfg80211_get_ie_ptr(v_U8_t *pIes, int length, v_U8_t eid)
+v_U8_t* wlan_hdd_cfg80211_get_ie_ptr(
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ const v_U8_t *pIes,
+#else
+ v_U8_t *pIes,
+#endif
+ int length, v_U8_t eid)
{
int left = length;
- v_U8_t *ptr = pIes;
+ v_U8_t *ptr = (v_U8_t *)pIes;
v_U8_t elem_id,elem_len;
while(left >= 2)
@@ -8408,7 +8473,13 @@
#ifdef FEATURE_WLAN_TDLS
static int wlan_hdd_tdls_add_station(struct wiphy *wiphy,
- struct net_device *dev, u8 *mac, bool update, tCsrStaParams *StaParams)
+ struct net_device *dev,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac,
+#else
+ u8 *mac,
+#endif
+ bool update, tCsrStaParams *StaParams)
{
hdd_context_t *pHddCtx = wiphy_priv(wiphy);
hddTdlsPeer_t *pTdlsPeer;
@@ -8641,7 +8712,11 @@
static int __wlan_hdd_change_station(struct wiphy *wiphy,
struct net_device *dev,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac,
+#else
u8 *mac,
+#endif
struct station_parameters *params)
{
VOS_STATUS status = VOS_STATUS_SUCCESS;
@@ -8814,10 +8889,17 @@
return status;
}
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0))
+static int wlan_hdd_change_station(struct wiphy *wiphy,
+ struct net_device *dev,
+ const u8 *mac,
+ struct station_parameters *params)
+#else
static int wlan_hdd_change_station(struct wiphy *wiphy,
struct net_device *dev,
u8 *mac,
struct station_parameters *params)
+#endif
{
int ret;
@@ -11513,12 +11595,20 @@
* This function is used to parse WPA/RSN IE's.
*/
int wlan_hdd_cfg80211_set_ie( hdd_adapter_t *pAdapter,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *ie,
+#else
u8 *ie,
+#endif
size_t ie_len
)
{
hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *genie = ie;
+#else
u8 *genie = ie;
+#endif
v_U16_t remLen = ie_len;
#ifdef FEATURE_WLAN_WAPI
v_U32_t akmsuite[MAX_NUM_AKM_SUITES];
@@ -11679,7 +11769,7 @@
/* populating as ADDIE in beacon frames */
if (ccmCfgSetStr(WLAN_HDD_GET_HAL_CTX(pAdapter),
- WNI_CFG_PROBE_RSP_BCN_ADDNIE_DATA, genie - 2, eLen + 2,
+ WNI_CFG_PROBE_RSP_BCN_ADDNIE_DATA, (u8 *)genie - 2, eLen + 2,
NULL, eANI_BOOLEAN_FALSE)== eHAL_STATUS_SUCCESS)
{
if (ccmCfgSetInt(WLAN_HDD_GET_HAL_CTX(pAdapter),
@@ -11877,7 +11967,13 @@
* Parse the received IE to find the WPA IE
*
*/
-static bool hdd_isWPAIEPresent(u8 *ie, u8 ie_len)
+static bool hdd_isWPAIEPresent(
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
+ const u8 *ie,
+#else
+ u8 *ie,
+#endif
+ u8 ie_len)
{
v_U8_t eLen = 0;
v_U16_t remLen = ie_len;
@@ -11913,9 +12009,9 @@
* This function is used to initialize the security
* parameters during connect operation.
*/
-int wlan_hdd_cfg80211_set_privacy( hdd_adapter_t *pAdapter,
+int wlan_hdd_cfg80211_set_privacy(hdd_adapter_t *pAdapter,
struct cfg80211_connect_params *req
- )
+ )
{
int status = 0;
hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
@@ -12578,9 +12674,9 @@
hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
tCsrRoamProfile *pRoamProfile;
int status;
- bool alloc_bssid = VOS_FALSE;
hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ tSirMacAddr bssid;
ENTER();
@@ -12636,6 +12732,7 @@
"%s:ccmCfgStInt faild for WNI_CFG_IBSS_AUTO_BSSID", __func__);
return -EIO;
}
+ vos_mem_copy((v_U8_t *)bssid, (v_U8_t *)params->bssid, sizeof(bssid));
}
else if(pHddCtx->cfg_ini->isCoalesingInIBSSAllowed == 0)
{
@@ -12646,17 +12743,10 @@
"%s:ccmCfgStInt faild for WNI_CFG_IBSS_AUTO_BSSID", __func__);
return -EIO;
}
- params->bssid = vos_mem_malloc(VOS_MAC_ADDR_SIZE);
- if (!params->bssid)
- {
- hddLog (VOS_TRACE_LEVEL_ERROR,
- "%s:Failed memory allocation", __func__);
- return -EIO;
- }
- vos_mem_copy((v_U8_t *)params->bssid,
+
+ vos_mem_copy((v_U8_t *)bssid,
(v_U8_t *)&pHddCtx->cfg_ini->IbssBssid.bytes[0],
- VOS_MAC_ADDR_SIZE);
- alloc_bssid = VOS_TRUE;
+ sizeof(bssid));
}
/* Set Channel */
@@ -12727,19 +12817,10 @@
pHddStaCtx->conn_info.operationChannel);
if (0 > status)
- {
hddLog(VOS_TRACE_LEVEL_ERROR, "%s: connect failed", __func__);
- return status;
- }
- if (NULL != params->bssid &&
- pHddCtx->cfg_ini->isCoalesingInIBSSAllowed == 0 &&
- alloc_bssid == VOS_TRUE)
- {
- vos_mem_free(params->bssid);
- }
EXIT();
- return 0;
+ return status;
}
static int wlan_hdd_cfg80211_join_ibss( struct wiphy *wiphy,
@@ -13127,9 +13208,13 @@
return ret;
}
-
static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
- u8* mac, struct station_info *sinfo)
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8* mac,
+#else
+ u8* mac,
+#endif
+ struct station_info *sinfo)
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev );
hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
@@ -13579,9 +13664,13 @@
EXIT();
return 0;
}
-
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0))
+static int wlan_hdd_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
+ const u8* mac, struct station_info *sinfo)
+#else
static int wlan_hdd_cfg80211_get_station(struct wiphy *wiphy, struct net_device *dev,
u8* mac, struct station_info *sinfo)
+#endif
{
int ret;
@@ -13848,9 +13937,14 @@
struct net_device *dev,
struct station_del_parameters *param)
#else
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0))
+static int wlan_hdd_cfg80211_del_station(struct wiphy *wiphy,
+ struct net_device *dev, const u8 *mac)
+#else
static int wlan_hdd_cfg80211_del_station(struct wiphy *wiphy,
struct net_device *dev, u8 *mac)
#endif
+#endif
{
int ret;
struct tagCsrDelStaParams delStaParams;
@@ -13879,7 +13973,13 @@
}
static int __wlan_hdd_cfg80211_add_station(struct wiphy *wiphy,
- struct net_device *dev, u8 *mac, struct station_parameters *params)
+ struct net_device *dev,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac,
+#else
+ u8 *mac,
+#endif
+ struct station_parameters *params)
{
hdd_adapter_t *pAdapter;
hdd_context_t *pHddCtx;
@@ -13924,8 +14024,14 @@
return status;
}
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0))
+static int wlan_hdd_cfg80211_add_station(struct wiphy *wiphy,
+ struct net_device *dev, const u8 *mac,
+ struct station_parameters *params)
+#else
static int wlan_hdd_cfg80211_add_station(struct wiphy *wiphy,
struct net_device *dev, u8 *mac, struct station_parameters *params)
+#endif
{
int ret;
@@ -14738,6 +14844,11 @@
MTRACE(vos_trace(VOS_MODULE_ID_HDD,
TRACE_CODE_HDD_CFG80211_SCHED_SCAN_STOP,
pAdapter->sessionId, pAdapter->device_mode));
+
+ INIT_COMPLETION(pAdapter->pno_comp_var);
+ pnoRequest.statusCallback = hdd_cfg80211_sched_scan_start_status_cb;
+ pnoRequest.callbackContext = pAdapter;
+ pAdapter->pno_req_status = 0;
status = sme_SetPreferredNetworkList(hHal, &pnoRequest,
pAdapter->sessionId,
NULL, pAdapter);
@@ -14748,7 +14859,22 @@
ret = -EINVAL;
goto error;
}
- pHddCtx->isPnoEnable = FALSE;
+ ret = wait_for_completion_timeout(
+ &pAdapter->pno_comp_var,
+ msecs_to_jiffies(WLAN_WAIT_TIME_PNO));
+ if (0 >= ret)
+ {
+ // Did not receive the response for PNO disable in time.
+ // Assuming the PNO disable was success.
+ // Returning error from here, because we timeout, results
+ // in side effect of Wifi (Wifi Setting) not to work.
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ FL("Timed out waiting for PNO to be disabled"));
+ ret = 0;
+ }
+
+ ret = pAdapter->pno_req_status;
+ pHddCtx->isPnoEnable = (ret == 0) ? FALSE : TRUE;
error:
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
@@ -16344,7 +16470,11 @@
return err;
}
-static int wlan_hdd_cfg80211_testmode(struct wiphy *wiphy, void *data, int len)
+static int wlan_hdd_cfg80211_testmode(struct wiphy *wiphy,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0))
+ struct wireless_dev *wdev,
+#endif
+ void *data, int len)
{
int ret;
diff --git a/CORE/HDD/src/wlan_hdd_ftm.c b/CORE/HDD/src/wlan_hdd_ftm.c
index 0e56a65..cbe31d0 100644
--- a/CORE/HDD/src/wlan_hdd_ftm.c
+++ b/CORE/HDD/src/wlan_hdd_ftm.c
@@ -4472,7 +4472,7 @@
status = VOS_STATUS_E_FAILURE;
goto done;
}
- *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
+ *pTxPwr = pMsgBody->GetTxPowerReport.pwrTemplateIndex;
done:
@@ -4495,11 +4495,8 @@
static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
{
- uPttMsgs *pMsgBody;
- VOS_STATUS status;
- v_U16_t rate_index,ii;
- long ret;
-
+ VOS_STATUS status = VOS_STATUS_SUCCESS;
+ v_U16_t ii;
hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
@@ -4509,51 +4506,8 @@
return VOS_STATUS_E_FAILURE;
}
- if (NULL == pMsgBuf)
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
- "%s:pMsgBuf is NULL", __func__);
- return VOS_STATUS_E_NOMEM;
- }
- vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
- init_completion(&pHddCtx->ftm.ftm_comp_var);
- pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
- pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
-
- pMsgBody = &pMsgBuf->msgBody;
-
- status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
-
- if (status != VOS_STATUS_SUCCESS)
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
- "%s:wlan_ftm_postmsg failed", __func__);
- status = VOS_STATUS_E_FAILURE;
- goto done;
- }
- ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
- msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
- if (0 >= ret )
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- FL("wait on ftm_comp_var failed %ld"), ret);
- }
-
- if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
-
- rate_index = pMsgBody->GetTxPowerReport.rate;
- }
- else {
- /*Return the default rate*/
- //rate_index = HAL_PHY_RATE_11A_6_MBPS;
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
- "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
- status = VOS_STATUS_E_FAILURE;
- goto done;
- }
-
for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
- if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
+ if(rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
break;
}
if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
@@ -4563,8 +4517,8 @@
goto done;
}
strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
-done:
+done:
return status;
}
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 02513b8..4ec80df 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -4947,8 +4947,11 @@
hdd_adapter_t *pHostapdAdapter = NULL;
v_CONTEXT_t pVosContext= NULL;
- pWlanHostapdDev = alloc_netdev_mq(sizeof(hdd_adapter_t), iface_name, ether_setup, NUM_TX_QUEUES);
-
+ pWlanHostapdDev = alloc_netdev_mq(sizeof(hdd_adapter_t), iface_name,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0))
+ NET_NAME_UNKNOWN,
+#endif
+ ether_setup, NUM_TX_QUEUES);
if (pWlanHostapdDev != NULL)
{
pHostapdAdapter = netdev_priv(pWlanHostapdDev);
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 64264ee..55652aa 100755
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -207,7 +207,14 @@
void hdd_set_wlan_suspend_mode(bool suspend);
v_U16_t hdd_select_queue(struct net_device *dev,
- struct sk_buff *skb);
+ struct sk_buff *skb
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,13,0))
+ , void *accel_priv
+#endif
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+ , select_queue_fallback_t fallback
+#endif
+);
#ifdef WLAN_FEATURE_PACKET_FILTERING
static void hdd_set_multicast_list(struct net_device *dev);
@@ -2277,6 +2284,9 @@
hdd_scaninfo_t *pScanInfo = NULL;
int ret = 0;
int status;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+ struct cfg80211_mgmt_tx_params params;
+#endif
ENTER();
/*
@@ -3109,6 +3119,16 @@
vos_mem_free(buf);
buf = NULL;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+ params.chan = &chan;
+ params.offchan = 0;
+ params.wait = dwellTime;
+ params.buf = finalBuf;
+ params.len = finalLen;
+ params.no_cck = 1;
+ params.dont_wait_for_ack = 1;
+ ret = wlan_hdd_mgmt_tx(NULL, &pAdapter->wdev, ¶ms, &cookie);
+#else
wlan_hdd_mgmt_tx( NULL,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
&(pAdapter->wdev),
@@ -3121,6 +3141,7 @@
#endif
dwellTime, finalBuf, finalLen, 1,
1, &cookie );
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)*/
vos_mem_free(finalBuf);
}
else if (strncmp(command, "GETROAMSCANCHANNELMINTIME", 25) == 0)
@@ -4343,7 +4364,13 @@
int set_value;
/* Move pointer to ahead of TDLSOFFCH*/
value += 26;
- sscanf(value, "%d", &set_value);
+ if (!(sscanf(value, "%d", &set_value))) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ FL("No input identified"));
+ ret = -EINVAL;
+ goto exit;
+ }
+
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"%s: Tdls offchannel offset:%d",
__func__, set_value);
@@ -4359,7 +4386,13 @@
int set_value;
/* Move pointer to ahead of tdlsoffchnmode*/
value += 18;
- sscanf(value, "%d", &set_value);
+ ret = sscanf(value, "%d", &set_value);
+ if (ret != 1) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ FL("No input identified"));
+ ret = -EINVAL;
+ goto exit;
+ }
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"%s: Tdls offchannel mode:%d",
__func__, set_value);
@@ -6220,8 +6253,11 @@
/*
* cfg80211 initialization and registration....
*/
- pWlanDev = alloc_netdev_mq(sizeof( hdd_adapter_t ), name, ether_setup, NUM_TX_QUEUES);
-
+ pWlanDev = alloc_netdev_mq(sizeof( hdd_adapter_t ), name,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0))
+ NET_NAME_UNKNOWN,
+#endif
+ ether_setup, NUM_TX_QUEUES);
if(pWlanDev != NULL)
{
@@ -7317,20 +7353,20 @@
ENTER();
- if ( VOS_TRUE == bCloseSession )
- {
- status = hdd_sta_id_hash_detach(pAdapter);
- if (status != VOS_STATUS_SUCCESS)
- hddLog(VOS_TRACE_LEVEL_ERROR,
- FL("sta id hash detach failed"));
- }
-
pScanInfo = &pHddCtx->scan_info;
switch(pAdapter->device_mode)
{
+ case WLAN_HDD_IBSS:
+ if ( VOS_TRUE == bCloseSession )
+ {
+ status = hdd_sta_id_hash_detach(pAdapter);
+ if (status != VOS_STATUS_SUCCESS)
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("sta id hash detach failed"));
+ }
+
case WLAN_HDD_INFRA_STATION:
case WLAN_HDD_P2P_CLIENT:
- case WLAN_HDD_IBSS:
case WLAN_HDD_P2P_DEVICE:
{
hdd_station_ctx_t *pstation = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
@@ -7456,6 +7492,14 @@
case WLAN_HDD_SOFTAP:
case WLAN_HDD_P2P_GO:
+ if ( VOS_TRUE == bCloseSession )
+ {
+ status = hdd_sta_id_hash_detach(pAdapter);
+ if (status != VOS_STATUS_SUCCESS)
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("sta id hash detach failed"));
+ }
+
//Any softap specific cleanup here...
if (pAdapter->device_mode == WLAN_HDD_P2P_GO) {
while (pAdapter->is_roc_inprogress) {
@@ -8260,7 +8304,14 @@
--------------------------------------------------------------------------*/
v_U16_t hdd_select_queue(struct net_device *dev,
- struct sk_buff *skb)
+ struct sk_buff *skb
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,13,0))
+ , void *accel_priv
+#endif
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+ , select_queue_fallback_t fallback
+#endif
+)
{
return hdd_wmm_select_queue(dev, skb);
}
@@ -8465,11 +8516,11 @@
{
VOS_STATUS vosStatus;
v_CONTEXT_t pVosContext = pHddCtx->pvosContext;
- struct wiphy *wiphy = pHddCtx->wiphy;
long ret;
hdd_mon_ctx_t *pMonCtx = NULL;
v_U32_t magic;
struct completion cmpVar;
+
hdd_adapter_t *pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_MONITOR);
if(pAdapter == NULL || pVosContext == NULL)
{
@@ -8526,15 +8577,7 @@
nl_srv_exit();
#endif
- if (pHddCtx->cfg_ini)
- {
- kfree(pHddCtx->cfg_ini);
- pHddCtx->cfg_ini= NULL;
- }
hdd_close_all_adapters( pHddCtx );
-
- wiphy_free(wiphy) ;
-
}
/**
* hdd_wlan_free_wiphy_channels - free Channel pointer for wiphy
@@ -8584,7 +8627,7 @@
{
hddLog(VOS_TRACE_LEVEL_ERROR,"%s: MONITOR MODE",__func__);
wlan_hdd_mon_close(pHddCtx);
- return;
+ goto free_hdd_ctx;
}
else if (VOS_FTM_MODE != hdd_get_conparam())
{
@@ -9188,6 +9231,7 @@
struct nlmsghdr *nlh;
tAniMsgHdr *ani_hdr;
int flags = GFP_KERNEL;
+ void *nl_data = NULL;
if (in_interrupt() || irqs_disabled() || in_atomic())
flags = GFP_ATOMIC;
@@ -9215,6 +9259,13 @@
nlh->nlmsg_len = NLMSG_LENGTH((sizeof(tAniMsgHdr)));
skb_put(skb, NLMSG_SPACE(sizeof(tAniMsgHdr)));
break;
+ case WLAN_MSG_RPS_ENABLE_IND:
+ ani_hdr->length = len;
+ nlh->nlmsg_len = NLMSG_LENGTH((sizeof(tAniMsgHdr) + len));
+ nl_data = (char *)ani_hdr + sizeof(tAniMsgHdr);
+ memcpy(nl_data, data, len);
+ skb_put(skb, NLMSG_SPACE(sizeof(tAniMsgHdr) + len));
+ break;
default:
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"Attempt to send unknown nlink message %d", type);
@@ -9537,6 +9588,46 @@
return;
}
+static void hdd_dp_util_send_rps_ind(hdd_context_t *hdd_ctxt)
+{
+ hdd_adapter_t *adapter;
+ hdd_adapter_list_node_t *adapter_node, *next;
+ VOS_STATUS status = VOS_STATUS_SUCCESS;
+ struct wlan_rps_data rps_data;
+ int count;
+
+ if(!hdd_ctxt->cfg_ini->rps_mask)
+ {
+ return;
+ }
+
+ for (count=0; count < WLAN_SVC_IFACE_NUM_QUEUES; count++)
+ {
+ rps_data.cpu_map[count] = hdd_ctxt->cfg_ini->rps_mask;
+ }
+
+ rps_data.num_queues = WLAN_SVC_IFACE_NUM_QUEUES;
+
+ hddLog(LOG1, FL("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x"),
+ rps_data.cpu_map[0], rps_data.cpu_map[1],rps_data.cpu_map[2],
+ rps_data.cpu_map[3], rps_data.cpu_map[4], rps_data.cpu_map[5]);
+
+ status = hdd_get_front_adapter (hdd_ctxt, &adapter_node);
+
+ while (NULL != adapter_node && VOS_STATUS_SUCCESS == status)
+ {
+ adapter = adapter_node->pAdapter;
+ if (NULL != adapter) {
+ strlcpy(rps_data.ifname, adapter->dev->name,
+ sizeof(rps_data.ifname));
+ wlan_hdd_send_svc_nlink_msg(WLAN_MSG_RPS_ENABLE_IND,
+ (void *)&rps_data,sizeof(rps_data));
+ }
+ status = hdd_get_next_adapter (hdd_ctxt, adapter_node, &next);
+ adapter_node = next;
+ }
+}
+
/**---------------------------------------------------------------------------
\brief hdd_wlan_startup() - HDD init function
@@ -10388,6 +10479,7 @@
{
hddLog(VOS_TRACE_LEVEL_INFO, FL("Registered IPv4 notifier"));
}
+ hdd_dp_util_send_rps_ind(pHddCtx);
goto success;
@@ -11384,8 +11476,11 @@
* the driver.
*
*/
-
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0))
+ cfg80211_rx_unprot_mlme_mgmt(pAdapterNode->pAdapter->dev, (u_int8_t*)mgmt, len);
+#else
cfg80211_send_unprot_deauth(pAdapterNode->pAdapter->dev, (u_int8_t*)mgmt, len );
+#endif
}
status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
pAdapterNode = pNext;
diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c
index 076bf8c..3119acc 100644
--- a/CORE/HDD/src/wlan_hdd_p2p.c
+++ b/CORE/HDD/src/wlan_hdd_p2p.c
@@ -173,22 +173,28 @@
{
hdd_adapter_t *pAdapter = (hdd_adapter_t*) pCtx;
hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
- hdd_remain_on_chan_ctx_t *pRemainChanCtx = cfgState->remain_on_chan_ctx;
+ hdd_remain_on_chan_ctx_t *pRemainChanCtx = NULL;
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ rem_on_channel_request_type_t req_type;
+
if (pHddCtx == NULL)
{
hddLog(LOGE, "%s: Hdd Context is NULL", __func__);
return eHAL_STATUS_FAILURE;
}
- if (pRemainChanCtx == NULL)
- {
- hddLog( LOGW,
- "%s: No Rem on channel pending for which Rsp is received", __func__);
- return eHAL_STATUS_SUCCESS;
- }
mutex_lock(&pHddCtx->roc_lock);
+
+ pRemainChanCtx = cfgState->remain_on_chan_ctx;
+ if (pRemainChanCtx == NULL)
+ {
+ hddLog( LOGW,
+ "%s: No Rem on channel pending for which Rsp is received", __func__);
+ mutex_unlock(&pHddCtx->roc_lock);
+ return eHAL_STATUS_SUCCESS;
+ }
+
hddLog( VOS_TRACE_LEVEL_INFO,
"Received ROC rsp (request type %d, channel %d, cookie %llu",
pRemainChanCtx->rem_on_chan_request,
@@ -196,7 +202,6 @@
pRemainChanCtx->cookie);
vos_timer_stop(&pRemainChanCtx->hdd_remain_on_chan_timer);
vos_timer_destroy(&pRemainChanCtx->hdd_remain_on_chan_timer);
- mutex_unlock(&pHddCtx->roc_lock);
if ( REMAIN_ON_CHANNEL_REQUEST == pRemainChanCtx->rem_on_chan_request )
{
if( cfgState->buf )
@@ -220,6 +225,8 @@
pAdapter->lastRocTs = vos_timer_get_system_time();
}
+ req_type = pRemainChanCtx->rem_on_chan_request;
+ mutex_unlock(&pHddCtx->roc_lock);
if ( ( WLAN_HDD_INFRA_STATION == pAdapter->device_mode ) ||
( WLAN_HDD_P2P_CLIENT == pAdapter->device_mode ) ||
@@ -227,7 +234,7 @@
)
{
tANI_U8 sessionId = pAdapter->sessionId;
- if( REMAIN_ON_CHANNEL_REQUEST == pRemainChanCtx->rem_on_chan_request )
+ if( REMAIN_ON_CHANNEL_REQUEST == req_type )
{
sme_DeregisterMgmtFrame(
hHal, sessionId,
@@ -242,12 +249,15 @@
(SIR_MAC_MGMT_FRAME << 2) | ( SIR_MAC_MGMT_PROBE_REQ << 4),
NULL, 0 );
}
- if (pRemainChanCtx->action_pkt_buff.frame_ptr != NULL
- && pRemainChanCtx->action_pkt_buff.frame_length != 0)
- {
- vos_mem_free(pRemainChanCtx->action_pkt_buff.frame_ptr);
- }
mutex_lock(&pHddCtx->roc_lock);
+ if ( pRemainChanCtx )
+ {
+ if (pRemainChanCtx->action_pkt_buff.frame_ptr != NULL
+ && pRemainChanCtx->action_pkt_buff.frame_length != 0)
+ {
+ vos_mem_free(pRemainChanCtx->action_pkt_buff.frame_ptr);
+ }
+ }
vos_mem_free( pRemainChanCtx );
pRemainChanCtx = NULL;
cfgState->remain_on_chan_ctx = NULL;
@@ -438,7 +448,7 @@
void wlan_hdd_remain_on_chan_timeout(void *data)
{
hdd_adapter_t *pAdapter = (hdd_adapter_t *)data;
- hdd_remain_on_chan_ctx_t *pRemainChanCtx;
+ hdd_remain_on_chan_ctx_t *pRemainChanCtx = NULL;
hdd_cfg80211_state_t *cfgState;
hdd_context_t *pHddCtx;
@@ -449,13 +459,16 @@
}
pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
+ mutex_lock(&pHddCtx->roc_lock);
pRemainChanCtx = cfgState->remain_on_chan_ctx;
+
if (NULL == pRemainChanCtx)
{
hddLog( LOGE, FL("No Remain on channel is pending"));
+ mutex_unlock(&pHddCtx->roc_lock);
return;
}
- mutex_lock(&pHddCtx->roc_lock);
+
if ( TRUE == pRemainChanCtx->hdd_remain_on_chan_cancel_in_progress )
{
mutex_unlock(&pHddCtx->roc_lock);
@@ -497,8 +510,11 @@
v_BOOL_t isGoPresent = VOS_FALSE;
hdd_context_t *pHddCtx;
hdd_cfg80211_state_t *cfgState;
- hdd_remain_on_chan_ctx_t *pRemainChanCtx;
+ hdd_remain_on_chan_ctx_t *pRemainChanCtx = NULL;
rem_on_channel_request_type_t request_type;
+ unsigned int duration;
+ v_U16_t hw_value;
+
int ret = 0;
ENTER();
@@ -521,7 +537,16 @@
"%s: cfgState is not valid ",__func__);
return -EINVAL;
}
+ mutex_lock(&pHddCtx->roc_lock);
pRemainChanCtx = cfgState->remain_on_chan_ctx;
+ if ( pRemainChanCtx == NULL)
+ {
+ mutex_unlock(&pHddCtx->roc_lock);
+ hddLog( LOGE,
+ "%s-%d: pRemainChanCtx is NULL",
+ __func__, __LINE__);
+ return ret;
+ }
request_type = pRemainChanCtx->rem_on_chan_request;
/* Initialize Remain on chan timer */
status = vos_timer_init(&pRemainChanCtx->hdd_remain_on_chan_timer,
@@ -534,9 +559,14 @@
FL("Not able to initalize remain_on_chan timer"));
cfgState->remain_on_chan_ctx = NULL;
vos_mem_free(pRemainChanCtx);
+ mutex_unlock(&pHddCtx->roc_lock);
return -EINVAL;
}
+ duration = pRemainChanCtx->duration;
+ hw_value = pRemainChanCtx->chan.hw_value;
+ mutex_unlock(&pHddCtx->roc_lock);
+
status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
{
@@ -559,15 +589,18 @@
//call sme API to start remain on channel.
if (eHAL_STATUS_SUCCESS != sme_RemainOnChannel(
WLAN_HDD_GET_HAL_CTX(pAdapter), sessionId,
- pRemainChanCtx->chan.hw_value, pRemainChanCtx->duration,
+ hw_value, duration,
wlan_hdd_remain_on_channel_callback, pAdapter,
(tANI_U8)(request_type == REMAIN_ON_CHANNEL_REQUEST)? TRUE:FALSE))
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
FL(" RemainOnChannel returned fail"));
+
+ mutex_lock(&pHddCtx->roc_lock);
cfgState->remain_on_chan_ctx = NULL;
vos_timer_destroy(&pRemainChanCtx->hdd_remain_on_chan_timer);
vos_mem_free (pRemainChanCtx);
+ mutex_unlock(&pHddCtx->roc_lock);
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_ROC);
return -EINVAL;
}
@@ -589,15 +622,17 @@
//call sme API to start remain on channel.
if (VOS_STATUS_SUCCESS != WLANSAP_RemainOnChannel(
(WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
- pRemainChanCtx->chan.hw_value, pRemainChanCtx->duration,
+ hw_value, duration,
wlan_hdd_remain_on_channel_callback, pAdapter ))
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s: WLANSAP_RemainOnChannel returned fail", __func__);
+ mutex_lock(&pHddCtx->roc_lock);
cfgState->remain_on_chan_ctx = NULL;
vos_timer_destroy(&pRemainChanCtx->hdd_remain_on_chan_timer);
vos_mem_free (pRemainChanCtx);
+ mutex_unlock(&pHddCtx->roc_lock);
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_ROC);
return -EINVAL;
}
@@ -689,12 +724,15 @@
return -EBUSY;
}
+ mutex_lock(&pHddCtx->roc_lock);
+
pRemainChanCtx = vos_mem_malloc( sizeof(hdd_remain_on_chan_ctx_t) );
if( NULL == pRemainChanCtx )
{
hddLog(VOS_TRACE_LEVEL_FATAL,
"%s: Not able to allocate memory for Channel context",
__func__);
+ mutex_unlock(&pHddCtx->roc_lock);
return -ENOMEM;
}
@@ -732,6 +770,9 @@
{
if (pRemainChanCtx->duration > HDD_P2P_MAX_ROC_DURATION)
pRemainChanCtx->duration = HDD_P2P_MAX_ROC_DURATION;
+
+ mutex_unlock(&pHddCtx->roc_lock);
+
schedule_delayed_work(&pAdapter->roc_work,
msecs_to_jiffies(pHddCtx->cfg_ini->gP2PListenDeferInterval));
hddLog(VOS_TRACE_LEVEL_INFO, "Defer interval is %hu, pAdapter %p",
@@ -741,6 +782,7 @@
}
}
+ mutex_unlock(&pHddCtx->roc_lock);
status = wlan_hdd_p2p_start_remain_on_channel(pAdapter);
EXIT();
@@ -831,15 +873,23 @@
{
hdd_cfg80211_state_t *cfgState = NULL;
hdd_remain_on_chan_ctx_t* pRemainChanCtx = NULL;
+ hdd_context_t *pHddCtx;
VOS_STATUS status;
if (NULL == pAdapter)
{
hddLog(LOGE, FL("pAdapter is NULL"));
return;
}
+ pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ if (NULL == pHddCtx)
+ {
+ hddLog(LOGE, FL("pHddCtx is NULL"));
+ return;
+ }
cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
- pRemainChanCtx = cfgState->remain_on_chan_ctx;
pAdapter->startRocTs = vos_timer_get_system_time();
+ mutex_lock(&pHddCtx->roc_lock);
+ pRemainChanCtx = cfgState->remain_on_chan_ctx;
if( pRemainChanCtx != NULL )
{
MTRACE(vos_trace(VOS_MODULE_ID_HDD,
@@ -876,7 +926,19 @@
// Check for cached action frame
if ( pRemainChanCtx->action_pkt_buff.frame_length != 0 )
{
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr,
+ pRemainChanCtx->action_pkt_buff.freq, 0,
+ pRemainChanCtx->action_pkt_buff.frame_ptr,
+ pRemainChanCtx->action_pkt_buff.frame_length,
+ NL80211_RXMGMT_FLAG_ANSWERED);
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0))
+ cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr,
+ pRemainChanCtx->action_pkt_buff.freq, 0,
+ pRemainChanCtx->action_pkt_buff.frame_ptr,
+ pRemainChanCtx->action_pkt_buff.frame_length,
+ NL80211_RXMGMT_FLAG_ANSWERED, GFP_ATOMIC);
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
cfg80211_rx_mgmt( pAdapter->dev->ieee80211_ptr,
pRemainChanCtx->action_pkt_buff.freq, 0,
pRemainChanCtx->action_pkt_buff.frame_ptr,
@@ -906,6 +968,7 @@
complete(&pAdapter->rem_on_chan_ready_event);
if (TRUE == pRemainChanCtx->is_pending_roc_cancelled)
{
+ mutex_unlock(&pHddCtx->roc_lock);
/* since pRemainChanCtx->is_pending_roc_cancelled is
* set, it means Cancel Reamain on channel command is
* pending because remain on channel event was not
@@ -914,9 +977,14 @@
*/
wlan_hdd_cancel_existing_remain_on_channel(pAdapter);
}
+ else
+ {
+ mutex_unlock(&pHddCtx->roc_lock);
+ }
}
else
{
+ mutex_unlock(&pHddCtx->roc_lock);
hddLog( LOGW, "%s: No Pending Remain on channel Request", __func__);
}
return;
@@ -935,7 +1003,7 @@
#endif
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
- hdd_remain_on_chan_ctx_t *pRemainChanCtx = cfgState->remain_on_chan_ctx;
+ hdd_remain_on_chan_ctx_t *pRemainChanCtx = NULL;
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
int status;
u64 cookie_dummy;
@@ -959,6 +1027,7 @@
* Need to check cookie and cancel accordingly
*/
mutex_lock(&pHddCtx->roc_lock);
+ pRemainChanCtx = cfgState->remain_on_chan_ctx;
if( (cfgState->remain_on_chan_ctx == NULL) ||
(cfgState->remain_on_chan_ctx->cookie != cookie) )
{
@@ -1411,13 +1480,12 @@
vos_mem_copy( cfgState->buf, buf, len);
+ mutex_lock(&pHddCtx->roc_lock);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
if( cfgState->remain_on_chan_ctx )
{
- mutex_lock(&pHddCtx->roc_lock);
cfgState->action_cookie = cfgState->remain_on_chan_ctx->cookie;
*cookie = cfgState->action_cookie;
- mutex_unlock(&pHddCtx->roc_lock);
}
else
{
@@ -1427,6 +1495,7 @@
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
}
#endif
+ mutex_unlock(&pHddCtx->roc_lock);
}
if ( (WLAN_HDD_INFRA_STATION == pAdapter->device_mode) ||
@@ -1495,7 +1564,10 @@
return 0;
}
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+int wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
+ struct cfg80211_mgmt_tx_params *params, u64 *cookie)
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
int wlan_hdd_mgmt_tx( struct wiphy *wiphy, struct wireless_dev *wdev,
struct ieee80211_channel *chan, bool offchan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))
@@ -1529,7 +1601,12 @@
int ret;
vos_ssr_protect(__func__);
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+ ret = __wlan_hdd_mgmt_tx(wiphy, wdev, params->chan, params->offchan,
+ params->wait, params->buf, params->len,
+ params->no_cck, params->dont_wait_for_ack,
+ cookie);
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
ret = __wlan_hdd_mgmt_tx(wiphy, wdev,
chan, offchan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))
@@ -2512,8 +2589,13 @@
//Indicate Frame Over Normal Interface
hddLog( LOG1, FL("Indicate Frame over NL80211 Interface"));
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr, freq, 0, pbFrames,
+ nFrameLength, NL80211_RXMGMT_FLAG_ANSWERED);
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0))
+ cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr, freq, 0, pbFrames,
+ nFrameLength, NL80211_RXMGMT_FLAG_ANSWERED, GFP_ATOMIC);
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
cfg80211_rx_mgmt( pAdapter->dev->ieee80211_ptr, freq, 0,
pbFrames, nFrameLength,
GFP_ATOMIC );
diff --git a/CORE/HDD/src/wlan_hdd_tdls.c b/CORE/HDD/src/wlan_hdd_tdls.c
index 7671f65..83b7704 100644
--- a/CORE/HDD/src/wlan_hdd_tdls.c
+++ b/CORE/HDD/src/wlan_hdd_tdls.c
@@ -56,7 +56,13 @@
static void wlan_hdd_tdls_implicit_send_discovery_request(tdlsCtx_t *pHddTdlsCtx);
#endif
-static u8 wlan_hdd_tdls_hash_key (u8 *mac)
+static u8 wlan_hdd_tdls_hash_key (
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac
+#else
+ u8 *mac
+#endif
+ )
{
int i;
u8 key = 0;
@@ -1205,7 +1211,13 @@
if mac address doesn't exist, create a list and add, return pointer
return NULL if fails to get new mac address
*/
-hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter, u8 *mac)
+hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac
+#else
+ u8 *mac
+#endif
+ )
{
struct list_head *head;
hddTdlsPeer_t *peer;
@@ -1330,7 +1342,11 @@
}
void wlan_hdd_tdls_set_link_status(hdd_adapter_t *pAdapter,
- u8* mac,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac,
+#else
+ u8 *mac,
+#endif
tTDLSLinkStatus linkStatus,
tTDLSLinkReason reason)
{
@@ -1465,7 +1481,11 @@
}
int wlan_hdd_tdls_set_peer_caps(hdd_adapter_t *pAdapter,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac,
+#else
u8 *mac,
+#endif
tCsrStaParams *StaParams,
tANI_BOOLEAN isBufSta,
tANI_BOOLEAN isOffChannelSupported)
@@ -1848,7 +1868,12 @@
/* if peerMac is found, then it returns pointer to hddTdlsPeer_t
otherwise, it returns NULL
*/
-hddTdlsPeer_t *wlan_hdd_tdls_find_peer(hdd_adapter_t *pAdapter, u8 *mac,
+hddTdlsPeer_t *wlan_hdd_tdls_find_peer(hdd_adapter_t *pAdapter,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac,
+#else
+ u8 *mac,
+#endif
tANI_BOOLEAN mutexLock)
{
u8 key;
@@ -2380,7 +2405,13 @@
* skip_self - if TRUE, skip this mac. otherwise, check all the peer list. if
mac is NULL, this argument is ignored, and check for all the peer list.
*/
-static hddTdlsPeer_t *wlan_hdd_tdls_find_progress_peer(hdd_adapter_t *pAdapter, u8 *mac, u8 skip_self)
+static hddTdlsPeer_t *wlan_hdd_tdls_find_progress_peer(hdd_adapter_t *pAdapter,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac,
+#else
+ u8 *mac,
+#endif
+ u8 skip_self)
{
int i;
struct list_head *head;
@@ -2417,7 +2448,12 @@
return NULL;
}
-hddTdlsPeer_t *wlan_hdd_tdls_is_progress(hdd_context_t *pHddCtx, u8 *mac,
+hddTdlsPeer_t *wlan_hdd_tdls_is_progress(hdd_context_t *pHddCtx,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const u8 *mac,
+#else
+ u8 *mac,
+#endif
u8 skip_self, tANI_BOOLEAN mutexLock)
{
hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index 747f2a8..962e47f 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -1174,10 +1174,11 @@
"%s: Request firmware for recovery",__func__);
WLANTL_TLDebugMessage(WLANTL_DEBUG_FW_CLEANUP);
}
-
+ mutex_lock(&pHddCtx->roc_lock);
pRemainChanCtx = hdd_get_remain_on_channel_ctx(pHddCtx);
if (!pRemainChanCtx)
{
+ mutex_unlock(&pHddCtx->roc_lock);
if (pAdapter->hdd_stats.hddTxRxStats.continuousTxTimeoutCount >
HDD_TX_STALL_SSR_THRESHOLD)
{
@@ -1191,6 +1192,7 @@
}
else
{
+ mutex_unlock(&pHddCtx->roc_lock);
VOS_TRACE(VOS_MODULE_ID_HDD_DATA, VOS_TRACE_LEVEL_ERROR,
"Remain on channel in progress");
/* The supplicant can retry "P2P Invitation Request" for 120 times
diff --git a/CORE/HDD/src/wlan_hdd_wmm.c b/CORE/HDD/src/wlan_hdd_wmm.c
index 8910878..14e93c4 100644
--- a/CORE/HDD/src/wlan_hdd_wmm.c
+++ b/CORE/HDD/src/wlan_hdd_wmm.c
@@ -2082,7 +2082,14 @@
@return : Qdisc queue index
===========================================================================*/
-v_U16_t hdd_hostapd_select_queue(struct net_device * dev, struct sk_buff *skb)
+v_U16_t hdd_hostapd_select_queue(struct net_device * dev, struct sk_buff *skb
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,13,0))
+ , void *accel_priv
+#endif
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+ , select_queue_fallback_t fallbac
+#endif
+)
{
WLANTL_ACEnumType ac;
sme_QosWmmUpType up = SME_QOS_WMM_UP_BE;
diff --git a/CORE/MAC/src/dph/dphHashTable.c b/CORE/MAC/src/dph/dphHashTable.c
index e6d7dc4..161779d 100644
--- a/CORE/MAC/src/dph/dphHashTable.c
+++ b/CORE/MAC/src/dph/dphHashTable.c
@@ -477,7 +477,7 @@
void
dphPrintMacAddr(tpAniSirGlobal pMac, tANI_U8 addr[], tANI_U32 level)
{
- limLog(pMac, (tANI_U16) level, FL("MAC ADDR = %d:%d:%d:%d:%d:%d"),
+ limLog(pMac, (tANI_U16) level, FL("MAC ADDR = %02x:%02x:%02x:%02x:%02x:%02x"),
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
}
diff --git a/CORE/MAC/src/pe/include/limApi.h b/CORE/MAC/src/pe/include/limApi.h
index 51a910f..5b869d3 100644
--- a/CORE/MAC/src/pe/include/limApi.h
+++ b/CORE/MAC/src/pe/include/limApi.h
@@ -127,6 +127,8 @@
extern void limCleanup(tpAniSirGlobal);
/// Function to post messages to LIM thread
extern tANI_U32 limPostMsgApi(tpAniSirGlobal, tSirMsgQ *);
+tANI_U32 limPostMsgApiHighPri(tpAniSirGlobal, tSirMsgQ *);
+
/**
* Function to process messages posted to LIM thread
* and dispatch to various sub modules within LIM module.
diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c
index 7aba26b..a9abca3 100644
--- a/CORE/MAC/src/pe/lim/limApi.c
+++ b/CORE/MAC/src/pe/lim/limApi.c
@@ -1265,6 +1265,35 @@
} /*** end limPostMsgApi() ***/
+/**
+ * limPostMsgApiHighPri()
+ *
+ * FUNCTION:
+ * This function is called from other thread while posting a
+ * message to LIM message Queue gSirLimMsgQ.
+ *
+ * LOGIC:
+ * NA
+ *
+ * ASSUMPTIONS:
+ * NA
+ *
+ * NOTE:
+ * NA
+ *
+ * @param pMac - Pointer to Global MAC structure
+ * @param pMsg - Pointer to the message structure
+ * @return None
+ */
+
+tANI_U32
+limPostMsgApiHighPri(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
+{
+ return vos_mq_post_message_high_pri(VOS_MQ_ID_PE, (vos_msg_t *) pMsg);
+
+
+} /*** end limPostMsgApi() ***/
+
/*--------------------------------------------------------------------------
diff --git a/CORE/MAC/src/pe/lim/limTimerUtils.c b/CORE/MAC/src/pe/lim/limTimerUtils.c
index c007fa3..0ff5c44 100644
--- a/CORE/MAC/src/pe/lim/limTimerUtils.c
+++ b/CORE/MAC/src/pe/lim/limTimerUtils.c
@@ -40,7 +40,7 @@
#include "limAssocUtils.h"
#include "limSecurityUtils.h"
#include "pmmApi.h"
-
+#include "limApi.h"
// default value 5000 ms for background scan period when it is disabled
#define LIM_BACKGROUND_SCAN_PERIOD_DEFAULT_MS 5000
@@ -774,7 +774,7 @@
msg.bodyptr = NULL;
msg.bodyval = 0;
- if ((statusCode = limPostMsgApi(pMac, &msg)) != eSIR_SUCCESS)
+ if ((statusCode = limPostMsgApiHighPri(pMac, &msg)) != eSIR_SUCCESS)
limLog(pMac, LOGE,
FL("posting message %X to LIM failed, reason=%d"),
msg.type, statusCode);
diff --git a/CORE/SME/inc/smeInside.h b/CORE/SME/inc/smeInside.h
index bdaffb8..ba70201 100644
--- a/CORE/SME/inc/smeInside.h
+++ b/CORE/SME/inc/smeInside.h
@@ -303,8 +303,20 @@
tANI_U8 sessionId,
tSirMacAddr peerMac,
tCsrTdlsLinkEstablishParams *tdlsLinkEstablishParams);
-eHalStatus csrTdlsAddPeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac);
-eHalStatus csrTdlsChangePeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac, tCsrStaParams *pstaParams);
+eHalStatus csrTdlsAddPeerSta(tHalHandle hHal, tANI_U8 sessionId,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tSirMacAddr peerMac
+#else
+ tSirMacAddr peerMac
+#endif
+ );
+eHalStatus csrTdlsChangePeerSta(tHalHandle hHal, tANI_U8 sessionId,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tSirMacAddr peerMac,
+#else
+ tSirMacAddr peerMac,
+#endif
+ tCsrStaParams *pstaParams);
eHalStatus csrTdlsDelPeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac);
eHalStatus csrTdlsProcessCmd(tpAniSirGlobal pMac,tSmeCmd *pCommand );
eHalStatus csrTdlsProcessLinkEstablish( tpAniSirGlobal pMac, tSmeCmd *cmd );
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 5b0d819..18ba17b 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -46,6 +46,7 @@
/*--------------------------------------------------------------------------
Include Files
------------------------------------------------------------------------*/
+#include <linux/version.h>
#include "ccmApi.h"
#include "csrApi.h"
#include "pmcApi.h"
@@ -3273,7 +3274,12 @@
\param staParams - Peer Station Parameters.
\- return VOS_STATUS_SUCCES
-------------------------------------------------------------------------*/
-VOS_STATUS sme_ChangeTdlsPeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac,
+VOS_STATUS sme_ChangeTdlsPeerSta(tHalHandle hHal, tANI_U8 sessionId,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tSirMacAddr peerMac,
+#else
+ tSirMacAddr peerMac,
+#endif
tCsrStaParams *pstaParams);
/* ---------------------------------------------------------------------------
\fn sme_AddTdlsPeerSta
@@ -3282,7 +3288,13 @@
\param peerMac - peer's Mac Adress.
\- return VOS_STATUS_SUCCES
-------------------------------------------------------------------------*/
-VOS_STATUS sme_AddTdlsPeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac);
+VOS_STATUS sme_AddTdlsPeerSta(tHalHandle hHal, tANI_U8 sessionId,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tSirMacAddr peerMac
+#else
+ tSirMacAddr peerMac
+#endif
+ );
/* ---------------------------------------------------------------------------
\fn sme_DeleteTdlsPeerSta
\brief API to Delete TDLS peer sta entry.
@@ -3503,7 +3515,11 @@
tANI_U8 channel);
eHalStatus sme_RoamDelPMKIDfromCache( tHalHandle hHal, tANI_U8 sessionId,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tANI_U8 *pBSSId,
+#else
tANI_U8 *pBSSId,
+#endif
tANI_BOOLEAN flush_cache );
void smeGetCommandQStatus( tHalHandle hHal );
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index b365122..e6f5dc9 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -12487,7 +12487,11 @@
}
eHalStatus csrRoamDelPMKIDfromCache( tpAniSirGlobal pMac, tANI_U32 sessionId,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tANI_U8 *pBSSId,
+#else
tANI_U8 *pBSSId,
+#endif
tANI_BOOLEAN flush_cache )
{
tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
@@ -15365,6 +15369,8 @@
{
tAniGetPEStatsReq *pMsg;
eHalStatus status = eHAL_STATUS_SUCCESS;
+ tSirMsgQ msgQ;
+
pMsg = vos_mem_malloc(sizeof(tAniGetPEStatsReq));
if ( NULL == pMsg )
{
@@ -15372,14 +15378,20 @@
return eHAL_STATUS_FAILURE;
}
// need to initiate a stats request to PE
- pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_STATISTICS_REQ);
+ pMsg->msgType = pal_cpu_to_be16((tANI_U16)WDA_GET_STATISTICS_REQ);
pMsg->msgLen = (tANI_U16)sizeof(tAniGetPEStatsReq);
pMsg->staId = staId;
pMsg->statsMask = statsMask;
- status = palSendMBMessage(pMac->hHdd, pMsg );
+
+ msgQ.type = WDA_GET_STATISTICS_REQ;
+ msgQ.reserved = 0;
+ msgQ.bodyptr = pMsg;
+ msgQ.bodyval = 0;
+ status = wdaPostCtrlMsg(pMac, &msgQ);
if(!HAL_STATUS_SUCCESS(status))
{
smsLog(pMac, LOG1, FL("Failed to send down the stats req "));
+ vos_mem_free(pMsg);
}
return status;
}
diff --git a/CORE/SME/src/csr/csrInsideApi.h b/CORE/SME/src/csr/csrInsideApi.h
index 74471c1..0a81326 100644
--- a/CORE/SME/src/csr/csrInsideApi.h
+++ b/CORE/SME/src/csr/csrInsideApi.h
@@ -37,6 +37,7 @@
#define CSR_INSIDE_API_H__
+#include <linux/version.h>
#include "csrSupport.h"
#include "smeInside.h"
#include "vos_nvitem.h"
@@ -1026,7 +1027,12 @@
eHalStatus csrUpdateChannelList(tpAniSirGlobal pMac);
eHalStatus csrRoamDelPMKIDfromCache( tpAniSirGlobal pMac, tANI_U32 sessionId,
- tANI_U8 *pBSSId, tANI_BOOLEAN flush_cache );
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tANI_U8 *pBSSId,
+#else
+ tANI_U8 *pBSSId,
+#endif
+ tANI_BOOLEAN flush_cache );
tANI_BOOLEAN csrElectedCountryInfo(tpAniSirGlobal pMac);
void csrAddVoteForCountryInfo(tpAniSirGlobal pMac, tANI_U8 *pCountryCode);
void csrClearVotesForCountryInfo(tpAniSirGlobal pMac);
diff --git a/CORE/SME/src/csr/csrTdlsProcess.c b/CORE/SME/src/csr/csrTdlsProcess.c
index 3ec86c7..e78e716 100644
--- a/CORE/SME/src/csr/csrTdlsProcess.c
+++ b/CORE/SME/src/csr/csrTdlsProcess.c
@@ -155,7 +155,12 @@
/*
* TDLS request API, called from HDD to modify an existing TDLS peer
*/
-eHalStatus csrTdlsChangePeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac,
+eHalStatus csrTdlsChangePeerSta(tHalHandle hHal, tANI_U8 sessionId,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tSirMacAddr peerMac,
+#else
+ tSirMacAddr peerMac,
+#endif
tCsrStaParams *pstaParams)
{
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
@@ -289,7 +294,13 @@
/*
* TDLS request API, called from HDD to add a TDLS peer
*/
-eHalStatus csrTdlsAddPeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac)
+eHalStatus csrTdlsAddPeerSta(tHalHandle hHal, tANI_U8 sessionId,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tSirMacAddr peerMac
+#else
+ tSirMacAddr peerMac
+#endif
+ )
{
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
tSmeCmd *tdlsAddStaCmd ;
diff --git a/CORE/SME/src/pmc/pmcApi.c b/CORE/SME/src/pmc/pmcApi.c
index d0017f4..160c991 100644
--- a/CORE/SME/src/pmc/pmcApi.c
+++ b/CORE/SME/src/pmc/pmcApi.c
@@ -3094,7 +3094,8 @@
pCommand->command = eSmeCommandPnoReq;
pCommand->sessionId = (tANI_U8)sessionId;
- if (!HAL_STATUS_SUCCESS(csrQueueSmeCommand(pMac, pCommand, TRUE)))
+ if (!HAL_STATUS_SUCCESS(csrQueueSmeCommand(pMac, pCommand,
+ !pRequestBuf->enable)))
{
VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
FL("failed to post eSmeCommandPnoReq command"));
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 92d15f7..92f7b11 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -3916,7 +3916,11 @@
}
eHalStatus sme_RoamDelPMKIDfromCache( tHalHandle hHal, tANI_U8 sessionId,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tANI_U8 *pBSSId,
+#else
tANI_U8 *pBSSId,
+#endif
tANI_BOOLEAN flush_cache )
{
eHalStatus status = eHAL_STATUS_FAILURE;
@@ -10667,7 +10671,12 @@
\param staParams - Peer Station Parameters
\- return VOS_STATUS_SUCCES
-------------------------------------------------------------------------*/
-VOS_STATUS sme_ChangeTdlsPeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac,
+VOS_STATUS sme_ChangeTdlsPeerSta(tHalHandle hHal, tANI_U8 sessionId,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tSirMacAddr peerMac,
+#else
+ tSirMacAddr peerMac,
+#endif
tCsrStaParams *pstaParams)
{
eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -10686,7 +10695,7 @@
status = sme_AcquireGlobalLock( &pMac->sme );
if ( HAL_STATUS_SUCCESS( status ) )
{
- status = csrTdlsChangePeerSta(hHal, sessionId, peerMac,pstaParams);
+ status = csrTdlsChangePeerSta(hHal, sessionId, peerMac, pstaParams);
sme_ReleaseGlobalLock( &pMac->sme );
}
@@ -10702,7 +10711,13 @@
\param peerMac - peer's Mac Adress.
\- return VOS_STATUS_SUCCES
-------------------------------------------------------------------------*/
-VOS_STATUS sme_AddTdlsPeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac)
+VOS_STATUS sme_AddTdlsPeerSta(tHalHandle hHal, tANI_U8 sessionId,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const tSirMacAddr peerMac
+#else
+ tSirMacAddr peerMac
+#endif
+ )
{
eHalStatus status = eHAL_STATUS_SUCCESS;
tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
diff --git a/CORE/SVC/external/wlan_nlink_common.h b/CORE/SVC/external/wlan_nlink_common.h
index 7baa885..4bd5698 100644
--- a/CORE/SVC/external/wlan_nlink_common.h
+++ b/CORE/SVC/external/wlan_nlink_common.h
@@ -39,7 +39,7 @@
#define WLAN_NLINK_COMMON_H__
#include <linux/netlink.h>
-
+#include <linux/if.h>
/*---------------------------------------------------------------------------
* External Functions
*-------------------------------------------------------------------------*/
@@ -85,6 +85,8 @@
// Special Message Type used by SoftAP, intercepted by send_btc_nlink_msg() and
// replaced by WLAN_STA_ASSOC_DONE_IND
#define WLAN_BTC_SOFTAP_BSS_START 0x11
+#define WLAN_MSG_RPS_ENABLE_IND 0x10A
+#define WLAN_SVC_IFACE_NUM_QUEUES 6
#define WLAN_SVC_SAP_RESTART_IND 0x108
// Event data for WLAN_BTC_QUERY_STATE_RSP & WLAN_STA_ASSOC_DONE_IND
@@ -99,14 +101,20 @@
ANI_NL_MSG_PUMAC = ANI_NL_MSG_BASE + 0x01,// PTT Socket App
ANI_NL_MSG_PTT = ANI_NL_MSG_BASE + 0x07,// Quarky GUI
WLAN_NL_MSG_BTC,
+ WLAN_NL_MSG_SVC = ANI_NL_MSG_BASE + 0x0A,
ANI_NL_MSG_LOG = ANI_NL_MSG_BASE + 0x0C,
- WLAN_NL_MSG_SVC,
ANI_NL_MSG_MAX
} tAniNlModTypes, tWlanNlModTypes;
#define WLAN_NL_MSG_BASE ANI_NL_MSG_BASE
#define WLAN_NL_MSG_MAX ANI_NL_MSG_MAX
+struct wlan_rps_data {
+ char ifname[IFNAMSIZ];
+ uint16_t num_queues;
+ uint16_t cpu_map[WLAN_SVC_IFACE_NUM_QUEUES];
+};
+
//All Netlink messages must contain this header
typedef struct sAniHdr {
unsigned short type;
diff --git a/CORE/VOSS/inc/i_vos_types.h b/CORE/VOSS/inc/i_vos_types.h
index cd03d2f..72c7421 100644
--- a/CORE/VOSS/inc/i_vos_types.h
+++ b/CORE/VOSS/inc/i_vos_types.h
@@ -35,6 +35,7 @@
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
+#include <linux/version.h>
#include <asm/div64.h>
/**=========================================================================
diff --git a/CORE/VOSS/inc/vos_event.h b/CORE/VOSS/inc/vos_event.h
index fb9762a..c039464 100644
--- a/CORE/VOSS/inc/vos_event.h
+++ b/CORE/VOSS/inc/vos_event.h
@@ -55,6 +55,10 @@
extern "C" {
#endif /* __cplusplus */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+#define INIT_COMPLETION(event) reinit_completion(&event)
+#endif
+
/*--------------------------------------------------------------------------
Type declarations
------------------------------------------------------------------------*/
diff --git a/CORE/VOSS/inc/vos_memory.h b/CORE/VOSS/inc/vos_memory.h
index 2c518e9..c6de77e 100644
--- a/CORE/VOSS/inc/vos_memory.h
+++ b/CORE/VOSS/inc/vos_memory.h
@@ -45,7 +45,7 @@
Include Files
------------------------------------------------------------------------*/
#include <vos_types.h>
-
+#include <linux/version.h>
/*--------------------------------------------------------------------------
Preprocessor definitions and constants
------------------------------------------------------------------------*/
@@ -210,7 +210,18 @@
locations are equal or not equal.
-------------------------------------------------------------------------------*/
-v_BOOL_t vos_mem_compare( v_VOID_t *pMemory1, v_VOID_t *pMemory2, v_U32_t numBytes );
+v_BOOL_t vos_mem_compare(
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const v_VOID_t *pMemory1,
+#else
+ v_VOID_t *pMemory1,
+#endif
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const v_VOID_t *pMemory2,
+#else
+ v_VOID_t *pMemory2,
+#endif
+ v_U32_t numBytes);
/** ---------------------------------------------------------------------------
diff --git a/CORE/VOSS/inc/vos_mq.h b/CORE/VOSS/inc/vos_mq.h
index 7194e35..e82dd00 100644
--- a/CORE/VOSS/inc/vos_mq.h
+++ b/CORE/VOSS/inc/vos_mq.h
@@ -156,6 +156,43 @@
--------------------------------------------------------------------------*/
VOS_STATUS vos_mq_post_message( VOS_MQ_ID msgQueueId, vos_msg_t *message );
+/**--------------------------------------------------------------------------
+ \brief vos_mq_post_message_high_pri() - posts a high priority message to
+ a message queue
+
+ This API allows messages to be posted to the head of a specific message
+ queue. Messages can be posted to the following message queues:
+
+ <ul>
+ <li> SME
+ <li> PE
+ <li> HAL
+ <li> TL
+ </ul>
+
+ \param msgQueueId - identifies the message queue upon which the message
+ will be posted.
+
+ \param message - a pointer to a message buffer. Memory for this message
+ buffer is allocated by the caller and free'd by the vOSS after the
+ message is posted to the message queue. If the consumer of the
+ message needs anything in this message, it needs to copy the contents
+ before returning from the message queue handler.
+
+ \return VOS_STATUS_SUCCESS - the message has been successfully posted
+ to the message queue.
+
+ VOS_STATUS_E_INVAL - The value specified by msgQueueId does not
+ refer to a valid Message Queue Id.
+
+ VOS_STATUS_E_FAULT - message is an invalid pointer.
+
+ VOS_STATUS_E_FAILURE - the message queue handler has reported
+ an unknown failure.
+ --------------------------------------------------------------------------*/
+
+VOS_STATUS vos_mq_post_message_high_pri(VOS_MQ_ID msgQueueId, vos_msg_t *message);
+
/**---------------------------------------------------------------------------
diff --git a/CORE/VOSS/inc/vos_nvitem.h b/CORE/VOSS/inc/vos_nvitem.h
index caec9fe..c180d1c 100644
--- a/CORE/VOSS/inc/vos_nvitem.h
+++ b/CORE/VOSS/inc/vos_nvitem.h
@@ -131,6 +131,10 @@
* to esp_dpp.h where the WLAN_PROVISION_DATA is present.
*/
#define CLPC_PROVISION_DATA L"WLAN_CLPC.PROVISION"
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+#define IEEE80211_CHAN_PASSIVE_SCAN IEEE80211_CHAN_NO_IR
+#define IEEE80211_CHAN_NO_IBSS IEEE80211_CHAN_NO_IR
+#endif
/*--------------------------------------------------------------------------
Type declarations
------------------------------------------------------------------------*/
diff --git a/CORE/VOSS/inc/vos_utils.h b/CORE/VOSS/inc/vos_utils.h
index ff7d8a9..5755336 100644
--- a/CORE/VOSS/inc/vos_utils.h
+++ b/CORE/VOSS/inc/vos_utils.h
@@ -47,6 +47,7 @@
------------------------------------------------------------------------*/
#include <vos_types.h>
#include <vos_status.h>
+#include <vos_event.h>
//#include <Wincrypt.h>
/*--------------------------------------------------------------------------
diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c
index 9304923..66ed456 100644
--- a/CORE/VOSS/src/vos_api.c
+++ b/CORE/VOSS/src/vos_api.c
@@ -1995,6 +1995,143 @@
} /* vos_mq_post_message()*/
+/**--------------------------------------------------------------------------
+ \brief vos_mq_post_message_high_pri() - posts a high priority message to
+ a message queue
+
+ This API allows messages to be posted to the head of a specific message
+ queue. Messages can be posted to the following message queues:
+
+ <ul>
+ <li> SME
+ <li> PE
+ <li> HAL
+ <li> TL
+ </ul>
+
+ \param msgQueueId - identifies the message queue upon which the message
+ will be posted.
+
+ \param message - a pointer to a message buffer. Memory for this message
+ buffer is allocated by the caller and free'd by the vOSS after the
+ message is posted to the message queue. If the consumer of the
+ message needs anything in this message, it needs to copy the contents
+ before returning from the message queue handler.
+
+ \return VOS_STATUS_SUCCESS - the message has been successfully posted
+ to the message queue.
+
+ VOS_STATUS_E_INVAL - The value specified by msgQueueId does not
+ refer to a valid Message Queue Id.
+
+ VOS_STATUS_E_FAULT - message is an invalid pointer.
+
+ VOS_STATUS_E_FAILURE - the message queue handler has reported
+ an unknown failure.
+ --------------------------------------------------------------------------*/
+VOS_STATUS vos_mq_post_message_high_pri(VOS_MQ_ID msgQueueId, vos_msg_t *pMsg)
+{
+ pVosMqType pTargetMq = NULL;
+ pVosMsgWrapper pMsgWrapper = NULL;
+
+ if ((gpVosContext == NULL) || (pMsg == NULL))
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: Null params or global vos context is null", __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ switch (msgQueueId)
+ {
+ /// Message Queue ID for messages bound for SME
+ case VOS_MQ_ID_SME:
+ {
+ pTargetMq = &(gpVosContext->vosSched.smeMcMq);
+ break;
+ }
+
+ /// Message Queue ID for messages bound for PE
+ case VOS_MQ_ID_PE:
+ {
+ pTargetMq = &(gpVosContext->vosSched.peMcMq);
+ break;
+ }
+
+ /// Message Queue ID for messages bound for WDA
+ case VOS_MQ_ID_WDA:
+ {
+ pTargetMq = &(gpVosContext->vosSched.wdaMcMq);
+ break;
+ }
+
+ /// Message Queue ID for messages bound for WDI
+ case VOS_MQ_ID_WDI:
+ {
+ pTargetMq = &(gpVosContext->vosSched.wdiMcMq);
+ break;
+ }
+
+ /// Message Queue ID for messages bound for TL
+ case VOS_MQ_ID_TL:
+ {
+ pTargetMq = &(gpVosContext->vosSched.tlMcMq);
+ break;
+ }
+
+ /// Message Queue ID for messages bound for the SYS module
+ case VOS_MQ_ID_SYS:
+ {
+ pTargetMq = &(gpVosContext->vosSched.sysMcMq);
+ break;
+ }
+
+ default:
+
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ ("%s: Trying to queue msg into unknown MC Msg queue ID %d"),
+ __func__, msgQueueId);
+
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ VOS_ASSERT(NULL !=pTargetMq);
+ if (pTargetMq == NULL)
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: pTargetMq == NULL", __func__);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ /*
+ ** Try and get a free Msg wrapper
+ */
+ pMsgWrapper = vos_mq_get(&gpVosContext->freeVosMq);
+
+ if (NULL == pMsgWrapper)
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS Core run out of message wrapper", __func__);
+ return VOS_STATUS_E_RESOURCES;
+ }
+
+ /*
+ ** Copy the message now
+ */
+ vos_mem_copy( (v_VOID_t*)pMsgWrapper->pVosMsg,
+ (v_VOID_t*)pMsg, sizeof(vos_msg_t));
+
+ vos_mq_put_front(pTargetMq, pMsgWrapper);
+
+ set_bit(MC_POST_EVENT_MASK, &gpVosContext->vosSched.mcEventFlag);
+ wake_up_interruptible(&gpVosContext->vosSched.mcWaitQueue);
+
+ return VOS_STATUS_SUCCESS;
+
+} /* vos_mq_post_message_high_pri()*/
+
+
+
/**---------------------------------------------------------------------------
\brief vos_tx_mq_serialize() - serialize a message to the Tx execution flow
diff --git a/CORE/VOSS/src/vos_memory.c b/CORE/VOSS/src/vos_memory.c
index c63feb4..accf991 100644
--- a/CORE/VOSS/src/vos_memory.c
+++ b/CORE/VOSS/src/vos_memory.c
@@ -461,7 +461,18 @@
memmove(pDst, pSrc, numBytes);
}
-v_BOOL_t vos_mem_compare( v_VOID_t *pMemory1, v_VOID_t *pMemory2, v_U32_t numBytes )
+v_BOOL_t vos_mem_compare(
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const v_VOID_t *pMemory1,
+#else
+ v_VOID_t *pMemory1,
+#endif
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ const v_VOID_t *pMemory2,
+#else
+ v_VOID_t *pMemory2,
+#endif
+ v_U32_t numBytes )
{
if (0 == numBytes)
{
diff --git a/CORE/VOSS/src/vos_mq.c b/CORE/VOSS/src/vos_mq.c
index b428189..91ed206 100644
--- a/CORE/VOSS/src/vos_mq.c
+++ b/CORE/VOSS/src/vos_mq.c
@@ -163,6 +163,42 @@
} /* vos_mq_put() */
+/*---------------------------------------------------------------------------
+
+ \brief vos_mq_put_front() - Add a message to the head of message queue
+
+ The \a vos_mq_put_front() function add a message to the head of Message queue.
+
+ \param pMq - pointer to the message queue
+
+ \param pMsgWrapper - Msg Wrapper containing the message
+
+ \return None
+
+ \sa vos_mq_put()
+
+---------------------------------------------------------------------------*/
+void vos_mq_put_front(pVosMqType pMq, pVosMsgWrapper pMsgWrapper)
+{
+ unsigned long flags;
+
+ /*
+ ** Some quick sanity check
+ */
+ if ((pMq == NULL) || (pMsgWrapper == NULL)) {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: NULL pointer passed",__func__);
+ return ;
+ }
+
+ spin_lock_irqsave(&pMq->mqLock, flags);
+
+ list_add(&pMsgWrapper->msgNode, &pMq->mqList);
+
+ spin_unlock_irqrestore(&pMq->mqLock, flags);
+
+} /* vos_mq_put_front() */
+
/*---------------------------------------------------------------------------
diff --git a/CORE/VOSS/src/vos_nvitem.c b/CORE/VOSS/src/vos_nvitem.c
index 3246919..bde1bd8 100644
--- a/CORE/VOSS/src/vos_nvitem.c
+++ b/CORE/VOSS/src/vos_nvitem.c
@@ -3641,7 +3641,11 @@
* will not change channel to active.
*/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+ if (!(wiphy->regulatory_flags & REGULATORY_STRICT_REG))
+#else
if (!(wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY ))
+#endif
{
if (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN))
{
@@ -4193,7 +4197,11 @@
/* default country is world roaming */
reg_domain = REGDOMAIN_WORLD;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+ wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
+#else
wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY;
+#endif
}
else if (REGDOMAIN_WORLD ==
pnvEFSTable->halnv.tables.defaultCountryTable.regDomain) {
@@ -4203,7 +4211,11 @@
else {
reg_domain = pnvEFSTable->halnv.tables.defaultCountryTable.regDomain;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0))
+ wiphy->regulatory_flags |= REGULATORY_STRICT_REG;
+#else
wiphy->flags |= WIPHY_FLAG_STRICT_REGULATORY;
+#endif
}
temp_reg_domain = cur_reg_domain = reg_domain;
diff --git a/CORE/VOSS/src/vos_sched.h b/CORE/VOSS/src/vos_sched.h
index 361f874..c757976 100644
--- a/CORE/VOSS/src/vos_sched.h
+++ b/CORE/VOSS/src/vos_sched.h
@@ -500,6 +500,7 @@
VOS_STATUS vos_mq_init(pVosMqType pMq);
void vos_mq_deinit(pVosMqType pMq);
void vos_mq_put(pVosMqType pMq, pVosMsgWrapper pMsgWrapper);
+void vos_mq_put_front(pVosMqType pMq, pVosMsgWrapper pMsgWrapper);
pVosMsgWrapper vos_mq_get(pVosMqType pMq);
v_BOOL_t vos_is_mq_empty(pVosMqType pMq);
pVosSchedContext get_vos_sched_ctxt(void);
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 89fa89f..dc5bbea 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -6176,8 +6176,8 @@
WDI_GetStatsRspParamsType *wdiGetStatsRsp,
void* pUserData)
{
- tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
tAniGetPEStatsRsp *pGetPEStatsRspParams;
+ vos_msg_t vosMsg;
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
"<------ %s " ,__func__);
@@ -6193,7 +6193,7 @@
return;
}
vos_mem_set(pGetPEStatsRspParams, wdiGetStatsRsp->usMsgLen, 0);
- pGetPEStatsRspParams->msgType = wdiGetStatsRsp->usMsgType;
+ pGetPEStatsRspParams->msgType = eWNI_SME_GET_STATISTICS_RSP;
pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp) +
(wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
@@ -6206,8 +6206,17 @@
vos_mem_copy( pGetPEStatsRspParams + 1,
wdiGetStatsRsp + 1,
wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
- /* send response to UMAC*/
- WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP, pGetPEStatsRspParams , 0) ;
+
+ vosMsg.type = eWNI_SME_GET_STATISTICS_RSP;
+ vosMsg.bodyptr = (void *)pGetPEStatsRspParams;
+ vosMsg.bodyval = 0;
+ if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME,
+ (vos_msg_t*)&vosMsg))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: fail to post eWNI_SME_GET_STATISTICS_RSP", __func__);
+ vos_mem_free(pGetPEStatsRspParams);
+ }
return;
}
@@ -6222,6 +6231,8 @@
WDI_Status status = WDI_STATUS_SUCCESS ;
WDI_GetStatsReqParamsType wdiGetStatsParam;
tAniGetPEStatsRsp *pGetPEStatsRspParams;
+ vos_msg_t vosMsg;
+
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
"------> %s " ,__func__);
wdiGetStatsParam.wdiGetStatsParamsInfo.ucSTAIdx =
@@ -6245,12 +6256,21 @@
vos_mem_free(pGetStatsParams);
return VOS_STATUS_E_NOMEM;
}
- pGetPEStatsRspParams->msgType = WDA_GET_STATISTICS_RSP;
+ pGetPEStatsRspParams->msgType = eWNI_SME_GET_STATISTICS_RSP;
pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp);
pGetPEStatsRspParams->staId = pGetStatsParams->staId;
pGetPEStatsRspParams->rc = eSIR_FAILURE;
- WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP,
- (void *)pGetPEStatsRspParams, 0) ;
+
+ vosMsg.type = eWNI_SME_GET_STATISTICS_RSP;
+ vosMsg.bodyptr = (void *)pGetPEStatsRspParams;
+ vosMsg.bodyval = 0;
+ if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME,
+ (vos_msg_t*)&vosMsg))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: fail to post eWNI_SME_GET_STATISTICS_RSP", __func__);
+ vos_mem_free(pGetPEStatsRspParams);
+ }
}
/* Free the request message */
vos_mem_free(pGetStatsParams);
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index 05812a1..2d4f7b2 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -16389,7 +16389,7 @@
wdiStatus = WDI_HAL_2_WDI_STATUS(halInitScanRspMsg.initScanRspParams.status);
- if ( pWDICtx->bInBmps )
+ if (pWDICtx->bInBmps && (WDI_STATUS_SUCCESS == wdiStatus))
{
// notify DTS that we are entering Full power
wptStatus = WDTS_SetPowerState(pWDICtx, WDTS_POWER_STATE_FULL, NULL);
@@ -16399,6 +16399,12 @@
WDI_ASSERT(0);
}
}
+ else
+ {
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "Error returned WDI_ProcessInitScanRspi:%d BMPS%d",
+ wdiStatus, pWDICtx->bInBmps);
+ }
/*Notify UMAC*/
wdiInitScanRspCb( wdiStatus, pWDICtx->pRspCBUserData);