summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2014-04-19 04:21:28 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2014-04-19 04:21:28 -0700
commitdd3c9d5cfc90938634c2adf36f8bfb29cb8706f2 (patch)
tree122c5017dd5fea73f279ce1fbec8ca93a5e97794
parent6086f4555c509688a94045c997887189032f78a5 (diff)
parentfb8c7af33e2c2d74c781d3c74ba9e6bd14cfd201 (diff)
Merge "Release 1.0.0.96 QCACLD WLAN Driver"
-rw-r--r--CORE/HDD/inc/wlan_hdd_main.h72
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c17
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c18
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c274
-rw-r--r--CORE/HDD/src/wlan_hdd_softap_tx_rx.c41
-rw-r--r--CORE/HDD/src/wlan_hdd_tdls.c3
-rw-r--r--CORE/MAC/inc/qwlan_version.h4
-rw-r--r--CORE/MAC/inc/sirApi.h1
-rw-r--r--CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c12
-rw-r--r--CORE/MAC/src/pe/lim/limProcessTdls.c32
-rw-r--r--CORE/MAC/src/pe/pmm/pmmApi.c101
-rw-r--r--CORE/SERVICES/WMA/wma.c58
-rw-r--r--CORE/SME/inc/csrApi.h1
-rw-r--r--CORE/SME/inc/smeInside.h1
-rw-r--r--CORE/SME/inc/sme_Api.h3
-rw-r--r--CORE/SME/src/csr/csrTdlsProcess.c2
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c13
-rw-r--r--Kbuild20
18 files changed, 595 insertions, 78 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 3b036e5304e8..9afb22b77ef3 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -1141,6 +1141,66 @@ typedef struct
v_TIME_t lastFrameTs;
}hdd_traffic_monitor_t;
+#ifdef FEATURE_GREEN_AP
+
+#define GREEN_AP_PS_ON_TIME (0)
+#define GREEN_AP_PS_DELAY_TIME (20)
+
+/*
+ * Green-AP power save state
+ */
+typedef enum
+{
+ GREEN_AP_PS_IDLE_STATE = 1,
+ GREEN_AP_PS_OFF_STATE,
+ GREEN_AP_PS_WAIT_STATE,
+ GREEN_AP_PS_ON_STATE,
+}hdd_green_ap_ps_state_t;
+
+typedef enum
+{
+ GREEN_AP_PS_START_EVENT = 1,
+ GREEN_AP_PS_STOP_EVENT,
+ GREEN_AP_ADD_STA_EVENT,
+ GREEN_AP_DEL_STA_EVENT,
+ GREEN_AP_PS_ON_EVENT,
+ GREEN_AP_PS_WAIT_EVENT,
+}hdd_green_ap_event_t;
+
+typedef struct
+{
+ uint64_t ps_on_count;
+ v_TIME_t ps_on_prev_ticks;
+ v_TIME_t ps_on_ticks;
+
+ uint64_t ps_off_count;
+ v_TIME_t ps_off_prev_ticks;
+ v_TIME_t ps_off_ticks;
+
+}hdd_green_ap_stats;
+
+/*
+ * Green-AP context
+ */
+typedef struct
+{
+ v_CONTEXT_t pHddContext;
+
+ v_U8_t ps_enable;
+ v_U32_t ps_on_time;
+ v_U32_t ps_delay_time;
+ v_U32_t num_nodes;
+
+ hdd_green_ap_ps_state_t ps_state;
+ hdd_green_ap_event_t ps_event;
+
+ vos_timer_t ps_timer;
+
+ hdd_green_ap_stats stats;
+
+}hdd_green_ap_ctx_t;
+#endif /* FEATURE_GREEN_AP */
+
/** Adapter stucture definition */
struct hdd_context_s
@@ -1396,6 +1456,9 @@ struct hdd_context_s
#endif
v_BOOL_t btCoexModeSet;
+#ifdef FEATURE_GREEN_AP
+ hdd_green_ap_ctx_t *green_ap_ctx;
+#endif
};
@@ -1564,4 +1627,13 @@ void wlan_hdd_auto_shutdown_enable(hdd_context_t *hdd_ctx, v_U8_t enable);
#endif
boolean hdd_is_5g_supported(hdd_context_t * pHddCtx);
+
+#ifdef FEATURE_GREEN_AP
+boolean hdd_wlan_green_ap_is_ps_on(hdd_context_t *pHddCtx);
+int hdd_wlan_green_ap_enable(hdd_adapter_t *pHostapdAdapter,
+ v_U8_t enable);
+void hdd_wlan_green_ap_mc(hdd_context_t *pHddCtx,
+ hdd_green_ap_event_t event);
+#endif
+
#endif // end #if !defined( WLAN_HDD_MAIN_H )
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index c99abefcf9bb..060d9c78349a 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -3629,7 +3629,7 @@ static int wlan_hdd_tdls_add_station(struct wiphy *wiphy,
return -EBUSY;
}
- pTdlsPeer = wlan_hdd_tdls_find_peer(pAdapter, mac, TRUE);
+ pTdlsPeer = wlan_hdd_tdls_get_peer(pAdapter, mac);
if ( NULL == pTdlsPeer ) {
VOS_TRACE( VOS_MODULE_ID_HDD, TDLS_LOG_LEVEL,
@@ -5908,8 +5908,12 @@ int wlan_hdd_cfg80211_connect_start( hdd_adapter_t *pAdapter,
{
vos_mem_zero((void *)(pRoamProfile->BSSIDs.bssid),WNI_CFG_BSSID_LEN);
}
- hddLog(LOG1, FL("Connect to SSID: %s opertating Channel: %u"),
- pRoamProfile->SSIDs.SSIDList->SSID.ssId, operatingChannel);
+
+ hddLog(LOG1, FL("Connect to SSID: %.*s operating Channel: %u"),
+ pRoamProfile->SSIDs.SSIDList->SSID.length,
+ pRoamProfile->SSIDs.SSIDList->SSID.ssId,
+ operatingChannel);
+
if ((IW_AUTH_WPA_VERSION_WPA == pWextState->wpaVersion) ||
(IW_AUTH_WPA_VERSION_WPA2 == pWextState->wpaVersion))
{
@@ -5977,6 +5981,7 @@ int wlan_hdd_cfg80211_connect_start( hdd_adapter_t *pAdapter,
{
hdd_select_cbmode(pAdapter,operatingChannel);
}
+
/* change conn_state to connecting before sme_RoamConnect(), because sme_RoamConnect()
* has a direct path to call hdd_smeRoamCallback(), which will change the conn_state
* If direct path, conn_state will be accordingly changed to NotConnected or Associated
@@ -9376,8 +9381,10 @@ static int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *d
pAdapter->mgmtTxCompletionStatus = TDLS_CTX_MAGIC;
INIT_COMPLETION(pAdapter->tdls_mgmt_comp);
- status = sme_SendTdlsMgmtFrame(WLAN_HDD_GET_HAL_CTX(pAdapter), pAdapter->sessionId,
- peerMac, action_code, dialog_token, status_code, (tANI_U8 *)buf, len, responder);
+ status = sme_SendTdlsMgmtFrame(WLAN_HDD_GET_HAL_CTX(pAdapter),
+ pAdapter->sessionId, peerMac, action_code,
+ dialog_token, status_code, peer_capability,
+ (tANI_U8 *)buf, len, responder);
if (VOS_STATUS_SUCCESS != status)
{
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 6f8d9d2a7665..3559f309e9b9 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -676,6 +676,14 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
pHddApCtx->operatingChannel = pSapEvent->sapevt.sapStartBssCompleteEvent.operatingChannel;
pHostapdState->bssState = BSS_START;
+#ifdef FEATURE_GREEN_AP
+ if (!(VOS_STA&pHddCtx->concurrency_mode))
+ hdd_wlan_green_ap_mc(pHddCtx, GREEN_AP_PS_START_EVENT);
+ else {
+ hdd_wlan_green_ap_mc(pHddCtx, GREEN_AP_PS_STOP_EVENT);
+ hddLog(VOS_TRACE_LEVEL_INFO, FL("Green-AP: STA interface detected, disable GreenAP"));
+ }
+#endif
// Send current operating channel of SoftAP to BTC-ES
send_btc_nlink_msg(WLAN_BTC_SOFTAP_BSS_START, 0);
@@ -745,6 +753,9 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
hddLog(LOG1, FL("BSS stop status = %s"),pSapEvent->sapevt.sapStopBssCompleteEvent.status ?
"eSAP_STATUS_FAILURE" : "eSAP_STATUS_SUCCESS");
+#ifdef FEATURE_GREEN_AP
+ hdd_wlan_green_ap_mc(pHddCtx, GREEN_AP_PS_STOP_EVENT);
+#endif
//Free up Channel List incase if it is set
#ifdef WLAN_FEATURE_MBSSID
sapCleanupChannelList(WLAN_HDD_GET_SAP_CTX_PTR(pHostapdAdapter));
@@ -956,6 +967,10 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
hdd_start_bus_bw_compute_timer(pHostapdAdapter);
spin_unlock_irqrestore(&pHddCtx->bus_bw_lock, flags);
#endif
+
+#ifdef FEATURE_GREEN_AP
+ hdd_wlan_green_ap_mc(pHddCtx, GREEN_AP_ADD_STA_EVENT);
+#endif
break;
case eSAP_STA_DISASSOC_EVENT:
memcpy(wrqu.addr.sa_data, &pSapEvent->sapevt.sapStationDisassocCompleteEvent.staMac,
@@ -1062,6 +1077,9 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
hdd_stop_bus_bw_compute_timer(pHostapdAdapter);
spin_unlock_irqrestore(&pHddCtx->bus_bw_lock, flags);
#endif
+#ifdef FEATURE_GREEN_AP
+ hdd_wlan_green_ap_mc(pHddCtx, GREEN_AP_DEL_STA_EVENT);
+#endif
break;
case eSAP_WPS_PBC_PROBE_REQ_EVENT:
{
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 1b4b4b066273..aa15fdae4f8a 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -288,6 +288,265 @@ VOS_STATUS hdd_parse_get_cckm_ie(tANI_U8 *pValue,
tANI_U8 *pCckmIeLen);
#endif /* FEATURE_WLAN_ESE && FEATURE_WLAN_ESE_UPLOAD */
+#ifdef FEATURE_GREEN_AP
+
+static void hdd_wlan_green_ap_timer_fn(void *phddctx)
+{
+ hdd_context_t *pHddCtx = (hdd_context_t *)phddctx;
+ hdd_green_ap_ctx_t *green_ap;
+
+ if (0 != wlan_hdd_validate_context(pHddCtx))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: HDD context is not valid", __func__);
+ return;
+ }
+ green_ap = pHddCtx->green_ap_ctx;
+
+ if (green_ap)
+ hdd_wlan_green_ap_mc(pHddCtx, green_ap->ps_event);
+}
+
+static VOS_STATUS hdd_wlan_green_ap_attach(hdd_context_t *pHddCtx)
+{
+ hdd_green_ap_ctx_t *green_ap;
+ VOS_STATUS status = VOS_STATUS_SUCCESS;
+
+ ENTER();
+
+ green_ap = vos_mem_malloc(sizeof(hdd_green_ap_ctx_t));
+
+ if (!green_ap) {
+ hddLog(LOGP, FL("Memory allocation for Green-AP failed!"));
+ status = VOS_STATUS_E_NOMEM;
+ goto error;
+ }
+
+ vos_mem_zero((void *)green_ap, sizeof(*green_ap));
+ green_ap->pHddContext = pHddCtx;
+ pHddCtx->green_ap_ctx = green_ap;
+
+ green_ap->ps_state = GREEN_AP_PS_OFF_STATE;
+ green_ap->ps_event = 0;
+ green_ap->num_nodes = 0;
+ green_ap->ps_on_time = GREEN_AP_PS_ON_TIME;
+ green_ap->ps_delay_time = GREEN_AP_PS_DELAY_TIME;
+
+ vos_timer_init(&green_ap->ps_timer,
+ VOS_TIMER_TYPE_SW,
+ hdd_wlan_green_ap_timer_fn,
+ (void *)pHddCtx);
+
+error:
+
+ EXIT();
+ return status;
+}
+
+static VOS_STATUS hdd_wlan_green_ap_deattach(hdd_context_t *pHddCtx)
+{
+ hdd_green_ap_ctx_t *green_ap = pHddCtx->green_ap_ctx;
+ VOS_STATUS status = VOS_STATUS_SUCCESS;
+
+ ENTER();
+
+ if (green_ap == NULL) {
+ hddLog(LOG1, FL("Green-AP is not enabled"));
+ status = VOS_STATUS_E_NOSUPPORT;
+ goto done;
+ }
+
+ /* check if the timer status is destroyed */
+ if (VOS_TIMER_STATE_RUNNING ==
+ vos_timer_getCurrentState(&green_ap->ps_timer))
+ {
+ vos_timer_stop(&green_ap->ps_timer);
+ }
+
+ /* Destroy the Green AP timer */
+ if (!VOS_IS_STATUS_SUCCESS(vos_timer_destroy(
+ &green_ap->ps_timer)))
+ {
+ hddLog(LOG1, FL("Cannot deallocate Green-AP's timer"));
+ }
+
+ /* release memory */
+ vos_mem_zero((void *)green_ap, sizeof(*green_ap));
+ vos_mem_free(green_ap);
+ pHddCtx->green_ap_ctx = NULL;
+
+done:
+
+ EXIT();
+ return status;
+}
+
+static void hdd_wlan_green_ap_update(hdd_context_t *pHddCtx,
+ hdd_green_ap_ps_state_t state,
+ hdd_green_ap_event_t event)
+{
+ hdd_green_ap_ctx_t *green_ap = pHddCtx->green_ap_ctx;
+
+ green_ap->ps_state = state;
+ green_ap->ps_event = event;
+}
+
+int hdd_wlan_green_ap_enable(hdd_adapter_t *pHostapdAdapter,
+ v_U8_t enable)
+{
+ int ret = 0;
+
+ hddLog(LOG1, "%s: Set Green-AP val: %d", __func__, enable);
+
+ ret = process_wma_set_command(
+ (int)pHostapdAdapter->sessionId,
+ (int)WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID,
+ enable,
+ DBG_CMD);
+
+ return ret;
+}
+
+
+boolean hdd_wlan_green_ap_is_ps_on(hdd_context_t *pHddCtx)
+{
+ hdd_green_ap_ctx_t *green_ap = pHddCtx->green_ap_ctx;
+
+ if (green_ap == NULL)
+ return FALSE;
+
+ return ((green_ap->ps_state == GREEN_AP_PS_ON_STATE)
+ && (green_ap->ps_enable));
+}
+
+
+void hdd_wlan_green_ap_mc(hdd_context_t *pHddCtx,
+ hdd_green_ap_event_t event)
+{
+ hdd_green_ap_ctx_t *green_ap = pHddCtx->green_ap_ctx;
+ hdd_adapter_t *pAdapter = NULL;
+
+ if (green_ap == NULL)
+ return ;
+
+ hddLog(LOG1, "%s: Green-AP event: %d, state: %d, num_nodes: %d",
+ __func__, event, green_ap->ps_state, green_ap->num_nodes);
+
+ /* handle the green ap ps event */
+ switch(event) {
+ case GREEN_AP_PS_START_EVENT:
+ green_ap->ps_enable = 1;
+ break;
+
+ case GREEN_AP_PS_STOP_EVENT:
+ green_ap->ps_enable = 0;
+ break;
+
+ case GREEN_AP_ADD_STA_EVENT:
+ green_ap->num_nodes++;
+ break;
+
+ case GREEN_AP_DEL_STA_EVENT:
+ if (green_ap->num_nodes)
+ green_ap->num_nodes--;
+ break;
+
+ case GREEN_AP_PS_ON_EVENT:
+ case GREEN_AP_PS_WAIT_EVENT:
+ break;
+
+ default:
+ hddLog(LOGE, "%s: invalid event %d", __func__, event);
+ break;
+ }
+
+ /* Confirm that power save is enabled before doing state transitions */
+ if (!green_ap->ps_enable) {
+ hdd_wlan_green_ap_update(pHddCtx,
+ GREEN_AP_PS_IDLE_STATE, GREEN_AP_PS_WAIT_EVENT);
+ goto done;
+ }
+
+ pAdapter = hdd_get_adapter (pHddCtx, WLAN_HDD_SOFTAP );
+
+ if (pAdapter == NULL) {
+ hddLog(LOGE, FL("Green-AP no SAP adapter"));
+ goto done;
+ }
+
+ /* handle the green ap ps state */
+ switch(green_ap->ps_state) {
+ case GREEN_AP_PS_IDLE_STATE:
+ hdd_wlan_green_ap_update(pHddCtx,
+ GREEN_AP_PS_OFF_STATE, GREEN_AP_PS_WAIT_EVENT);
+ break;
+
+ case GREEN_AP_PS_OFF_STATE:
+ if (!green_ap->num_nodes) {
+ hdd_wlan_green_ap_update(pHddCtx,
+ GREEN_AP_PS_WAIT_STATE, GREEN_AP_PS_WAIT_EVENT);
+ vos_timer_start(&green_ap->ps_timer,
+ green_ap->ps_delay_time);
+ }
+ break;
+
+ case GREEN_AP_PS_WAIT_STATE:
+ if (!green_ap->num_nodes) {
+ hdd_wlan_green_ap_update(pHddCtx,
+ GREEN_AP_PS_ON_STATE, GREEN_AP_PS_WAIT_EVENT);
+
+ hdd_wlan_green_ap_enable(pAdapter, 1);
+
+ if (green_ap->ps_on_time) {
+ hdd_wlan_green_ap_update(pHddCtx,
+ 0, GREEN_AP_PS_WAIT_EVENT);
+ vos_timer_start(&green_ap->ps_timer,
+ green_ap->ps_on_time);
+ }
+ } else {
+ hdd_wlan_green_ap_update(pHddCtx,
+ GREEN_AP_PS_OFF_STATE, GREEN_AP_PS_WAIT_EVENT);
+ }
+ break;
+
+ case GREEN_AP_PS_ON_STATE:
+ if (green_ap->num_nodes) {
+ if (hdd_wlan_green_ap_enable(pAdapter, 0)) {
+ hddLog(LOGE, FL("FAILED TO SET GREEN-AP mode"));
+ goto done;
+ }
+ hdd_wlan_green_ap_update(pHddCtx,
+ GREEN_AP_PS_OFF_STATE, GREEN_AP_PS_WAIT_EVENT);
+ } else if ((green_ap->ps_event = GREEN_AP_PS_WAIT_EVENT) &&
+ (green_ap->ps_on_time)) {
+
+ /* ps_on_time timeout, switch to ps off */
+ hdd_wlan_green_ap_update(pHddCtx,
+ GREEN_AP_PS_WAIT_STATE, GREEN_AP_PS_ON_EVENT);
+
+ if (hdd_wlan_green_ap_enable(pAdapter, 0)) {
+ hddLog(LOGE, FL("FAILED TO SET GREEN-AP mode"));
+ goto done;
+ }
+
+ vos_timer_start(&green_ap->ps_timer,
+ green_ap->ps_delay_time);
+ }
+ break;
+
+ default:
+ hddLog(LOGE, "%s: invalid state %d", __func__, green_ap->ps_state);
+ hdd_wlan_green_ap_update(pHddCtx,
+ GREEN_AP_PS_OFF_STATE, GREEN_AP_PS_WAIT_EVENT);
+ break;
+ }
+
+done:
+ return;
+}
+
+#endif /* FEATURE_GREEN_AP */
+
static int hdd_netdev_notifier_call(struct notifier_block * nb,
unsigned long state,
void *ndev)
@@ -9688,6 +9947,14 @@ void hdd_wlan_exit(hdd_context_t *pHddCtx)
//This frees pMac(HAL) context. There should not be any call that requires pMac access after this.
vos_close(pVosContext);
+#ifdef FEATURE_GREEN_AP
+ if (!VOS_IS_STATUS_SUCCESS(
+ hdd_wlan_green_ap_deattach(pHddCtx)))
+ {
+ hddLog(LOGE, FL("Cannot deallocate Green-AP resource"));
+ }
+#endif
+
//Close Watchdog
if(pHddCtx->cfg_ini->fIsLogpEnabled)
vos_watchdog_close(pVosContext);
@@ -11186,6 +11453,13 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc)
}
#endif
+#ifdef FEATURE_GREEN_AP
+ if (!VOS_IS_STATUS_SUCCESS(
+ hdd_wlan_green_ap_attach(pHddCtx))) {
+ hddLog(LOGE, FL("Failed to allocate Green-AP resource"));
+ }
+#endif
+
#ifndef QCA_WIFI_ISOC
/* Thermal Mitigation */
thermalParam.smeThermalMgmtEnabled =
diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
index d4eed4127121..b875a2dfb7fe 100644
--- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
@@ -134,7 +134,7 @@ VOS_STATUS hdd_start_trafficMonitor( hdd_adapter_t *pAdapter )
if (0 != status)
{
- VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_ERROR,
"%s: HDD context is not valid", __func__);
return status;
}
@@ -174,7 +174,7 @@ VOS_STATUS hdd_stop_trafficMonitor( hdd_adapter_t *pAdapter )
if (-ENODEV == status)
{
- VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_ERROR,
"%s: HDD context is not valid", __func__);
return status;
}
@@ -378,7 +378,7 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
if (pAdapter->aStaInfo[STAId].wmm_tx_queue[ac].count >= HDD_TX_QUEUE_LOW_WATER_MARK)
{
- VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_WARN,
"%s: TX queue for Best Effort AC is 3/4th full", __func__);
pAdapter->aStaInfo[STAId].vosLowResource = VOS_TRUE;
}
@@ -391,7 +391,7 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
if (VOS_TRUE == txSuspended)
{
- VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_WARN,
"%s: TX queue full for AC=%d Disable OS TX queue",
__func__, ac );
os_status = NETDEV_TX_BUSY;
@@ -480,7 +480,7 @@ void hdd_softap_tx_resume_timer_expired_handler(void *adapter_context)
if (!pAdapter)
{
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ VOS_TRACE(VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_ERROR,
"%s: INV ARG", __func__);
/* INVALID ARG */
return;
@@ -506,7 +506,7 @@ void hdd_softap_tx_resume_cb(void *adapter_context,
if (!pAdapter)
{
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ VOS_TRACE(VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_ERROR,
"%s: INV ARG", __func__);
/* INVALID ARG */
return;
@@ -553,7 +553,7 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
not be reinitialized at this time which will lead crash. */
if (pHddCtx->isLogpInProgress)
{
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ VOS_TRACE(VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_ERROR,
"%s: LOGP in Progress. Ignore!!!", __func__);
goto drop_pkt;
}
@@ -562,7 +562,7 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
++pAdapter->hdd_stats.hddTxRxStats.txXmitCalled;
- VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_INFO,
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_INFO,
"%s: enter", __func__);
if (vos_is_macaddr_broadcast( pDestMacAddress ) ||
@@ -577,13 +577,13 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
STAId = *(v_U8_t *)(((v_U8_t *)(skb->data)) - 1);
if (STAId == HDD_WLAN_INVALID_STA_ID)
{
- VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_WARN,
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_WARN,
"%s: Failed to find right station", __func__);
goto drop_pkt;
}
else if (FALSE == pAdapter->aStaInfo[STAId].isUsed )
{
- VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_WARN,
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_WARN,
"%s: STA %d is unregistered", __func__, STAId);
goto drop_pkt;
}
@@ -591,7 +591,7 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
if ( (WLANTL_STA_CONNECTED != pAdapter->aStaInfo[STAId].tlSTAState) &&
(WLANTL_STA_AUTHENTICATED != pAdapter->aStaInfo[STAId].tlSTAState) )
{
- VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_WARN,
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_WARN,
"%s: Station not connected yet", __func__);
goto drop_pkt;
}
@@ -599,7 +599,7 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
if(ntohs(skb->protocol) != HDD_ETHERTYPE_802_1_X)
{
- VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_WARN,
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_WARN,
"%s: NON-EAPOL packet in non-Authenticated state", __func__);
goto drop_pkt;
}
@@ -669,7 +669,7 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
, proto_type
#endif /* QCA_PKT_PROTO_TRACE */
) != NULL) {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
+ VOS_TRACE(VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_WARN,
"%s: Failed to send packet to txrx for staid:%d",
__func__, STAId);
goto drop_pkt;
@@ -681,7 +681,7 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
dev->trans_start = jiffies;
- VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_INFO_LOW, "%s: exit", __func__);
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_INFO_LOW, "%s: exit", __func__);
return NETDEV_TX_OK;
@@ -1731,14 +1731,14 @@ VOS_STATUS hdd_softap_rx_packet_cbk(v_VOID_t *vosContext,
//Sanity check on inputs
if ((NULL == vosContext) || (NULL == rxBuf))
{
- VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: Null params being passed", __func__);
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_ERROR,"%s: Null params being passed", __func__);
return VOS_STATUS_E_FAILURE;
}
pHddCtx = (hdd_context_t *)vos_get_context( VOS_MODULE_ID_HDD, vosContext );
if ( NULL == pHddCtx )
{
- VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_ERROR,"%s: HDD adapter context is Null", __func__);
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_ERROR,"%s: HDD adapter context is Null", __func__);
return VOS_STATUS_E_FAILURE;
}
@@ -1759,7 +1759,8 @@ VOS_STATUS hdd_softap_rx_packet_cbk(v_VOID_t *vosContext,
if (skb->dev == NULL) {
- hddLog(VOS_TRACE_LEVEL_FATAL, "ERROR!!Invalid netdevice");
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_ERROR,
+ "%s: ERROR!!Invalid netdevice", __func__);
return VOS_STATUS_E_FAILURE;
}
++pAdapter->hdd_stats.hddTxRxStats.rxPackets;
@@ -1783,7 +1784,7 @@ VOS_STATUS hdd_softap_rx_packet_cbk(v_VOID_t *vosContext,
}
#endif /* QCA_PKT_PROTO_TRACE */
- VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_INFO_LOW,
+ VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_INFO_LOW,
"%s: send one packet to kernel", __func__);
skb->protocol = eth_type_trans(skb, skb->dev);
@@ -1832,7 +1833,7 @@ VOS_STATUS hdd_softap_rx_mul_packet_cbk(v_VOID_t *vosContext,
status = hdd_softap_rx_packet_cbk(vosContext, buf, staId);
if(!VOS_IS_STATUS_SUCCESS(status))
{
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ VOS_TRACE(VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_ERROR,
"%s: RX fail, satus %d", __func__, status);
return status;
}
@@ -2108,7 +2109,7 @@ VOS_STATUS hdd_softap_stop_bss( hdd_adapter_t *pAdapter)
if ((pHddCtx->isLoadInProgress) ||
(pHddCtx->isUnloadInProgress))
{
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ VOS_TRACE(VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_ERROR,
"%s:Loading_unloading in Progress. Ignore!!!",__func__);
return VOS_STATUS_E_PERM;
}
diff --git a/CORE/HDD/src/wlan_hdd_tdls.c b/CORE/HDD/src/wlan_hdd_tdls.c
index 050d51d41ac5..8e1a24e9a9a5 100644
--- a/CORE/HDD/src/wlan_hdd_tdls.c
+++ b/CORE/HDD/src/wlan_hdd_tdls.c
@@ -226,7 +226,7 @@ static v_VOID_t wlan_hdd_tdls_discover_peer_cb( v_PVOID_t userData )
pHddTdlsCtx->pAdapter->sessionId,
curr_peer->peerMac,
WLAN_TDLS_DISCOVERY_REQUEST,
- 1, 0, NULL, 0, 0);
+ 1, 0, 0, NULL, 0, 0);
curr_peer->discovery_attempt++;
}
else
@@ -932,6 +932,7 @@ void wlan_hdd_tdls_exit(hdd_adapter_t *pAdapter)
#endif
vos_mem_free(pHddTdlsCtx);
+ pAdapter->sessionCtx.station.pHddTdlsCtx = NULL;
pHddTdlsCtx = NULL;
}
diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h
index 196f7fcb1aca..af9b06bbc5dd 100644
--- a/CORE/MAC/inc/qwlan_version.h
+++ b/CORE/MAC/inc/qwlan_version.h
@@ -42,9 +42,9 @@ BRIEF DESCRIPTION:
#define QWLAN_VERSION_MINOR 0
#define QWLAN_VERSION_PATCH 0
#define QWLAN_VERSION_EXTRA ""
-#define QWLAN_VERSION_BUILD 95
+#define QWLAN_VERSION_BUILD 96
-#define QWLAN_VERSIONSTR "1.0.0.95"
+#define QWLAN_VERSIONSTR "1.0.0.96"
#ifdef QCA_WIFI_2_0
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 045a1f000ad6..f5d0807041e0 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -4142,6 +4142,7 @@ typedef struct sSirTdlsSendMgmtReq
tANI_U8 dialog;
tANI_U16 statusCode;
tANI_U8 responder;
+ tANI_U32 peerCapability;
tSirMacAddr bssid; // For multi-session, for PE to locate peSession ID
tSirMacAddr peerMac;
tANI_U8 addIe[1]; //Variable lenght. Dont add any field after this.
diff --git a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
index f8d95b28761f..086d974294ac 100644
--- a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
@@ -1393,6 +1393,18 @@ if (limPopulateMatchingRateSet(pMac,
}
+ /* AddSta is sucess here */
+ if((psessionEntry->limSystemRole == eLIM_AP_ROLE) &&
+ IS_DOT11_MODE_HT(psessionEntry->dot11mode) &&
+ pAssocReq->HTCaps.present && pAssocReq->wmeInfoPresent)
+ {
+
+ /** Update in the HAL Station Table for the Update of the Protection Mode */
+ limPostSMStateUpdate(pMac,pStaDs->staIndex,
+ pStaDs->htMIMOPSState,
+ pStaDs->staAddr, psessionEntry->smeSessionId);
+ }
+
return;
error:
diff --git a/CORE/MAC/src/pe/lim/limProcessTdls.c b/CORE/MAC/src/pe/lim/limProcessTdls.c
index ef70cc210520..c5352fdf8d60 100644
--- a/CORE/MAC/src/pe/lim/limProcessTdls.c
+++ b/CORE/MAC/src/pe/lim/limProcessTdls.c
@@ -174,6 +174,15 @@ typedef enum tdlsLinkSetupStatus
TDLS_SETUP_STATUS_FAILURE = 37
}etdlsLinkSetupStatus ;
+/* These maps to Kernel TDLS peer capability
+ * flags and should get changed as and when necessary
+ */
+enum tdls_peer_capability {
+ TDLS_PEER_HT_CAP = 0,
+ TDLS_PEER_VHT_CAP = 1,
+ TDLS_PEER_WMM_CAP = 2
+} eTdlsPeerCapability;
+
/* some local defines */
#define LINK_IDEN_BSSID_OFFSET (0)
#define PEER_MAC_OFFSET (12)
@@ -1306,7 +1315,6 @@ tSirRetStatus limSendTdlsLinkSetupReqFrame(tpAniSirGlobal pMac,
tdlsSetupReq.QOSCapsStation.acvi_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x02)>> 1);
tdlsSetupReq.QOSCapsStation.acvo_uapsd = (pMac->lim.gLimTDLSUapsdMask & 0x01);
-
/*
* we will always try to init TDLS link with 11n capabilities
* let TDLS setup response to come, and we will set our caps based
@@ -1876,8 +1884,12 @@ static tSirRetStatus limSendTdlsSetupRspFrame(tpAniSirGlobal pMac,
* Send TDLS setup CNF frame on AP link
*/
-tSirRetStatus limSendTdlsLinkSetupCnfFrame(tpAniSirGlobal pMac, tSirMacAddr peerMac,
- tANI_U8 dialog, tpPESession psessionEntry, tANI_U8* addIe, tANI_U16 addIeLen)
+tSirRetStatus limSendTdlsLinkSetupCnfFrame(tpAniSirGlobal pMac,
+ tSirMacAddr peerMac,
+ tANI_U8 dialog,
+ tANI_U32 peerCapability,
+ tpPESession psessionEntry,
+ tANI_U8* addIe, tANI_U16 addIeLen)
{
tDot11fTDLSSetupCnf tdlsSetupCnf ;
tANI_U32 status = 0 ;
@@ -1923,15 +1935,15 @@ tSirRetStatus limSendTdlsLinkSetupCnfFrame(tpAniSirGlobal pMac, tSirMacAddr peer
* AP link and we wanted to QOS on direct link.
*/
- /* Include HT Info IE */
- /* Need to also check the Self Capability ??? TODO Sunil */
- if ( true == psessionEntry->htCapability)
+ /* Check peer is VHT capable*/
+ if (CHECK_BIT(peerCapability, TDLS_PEER_VHT_CAP))
{
+ PopulateDot11fVHTOperation( pMac, &tdlsSetupCnf.VHTOperation);
PopulateDot11fHTInfo( pMac, &tdlsSetupCnf.HTInfo, psessionEntry );
}
- if ( true == psessionEntry->vhtCapability)
+ else if (CHECK_BIT(peerCapability, TDLS_PEER_HT_CAP)) /* Check peer is HT capable */
{
- PopulateDot11fVHTOperation( pMac, &tdlsSetupCnf.VHTOperation);
+ PopulateDot11fHTInfo( pMac, &tdlsSetupCnf.HTInfo, psessionEntry );
}
/*
@@ -3593,7 +3605,7 @@ static tSirRetStatus limProcessTdlsSetupRspFrame(tpAniSirGlobal pMac,
/* send TDLS confim frame to TDLS Peer STA */
- limSendTdlsLinkSetupCnfFrame(pMac, peerMac, tdlsSetupRsp.DialogToken.token, psessionEntry, NULL, 0) ;
+ limSendTdlsLinkSetupCnfFrame(pMac, peerMac, tdlsSetupRsp.DialogToken.token, 0, psessionEntry, NULL, 0) ;
/*
* set the tdls_link_state to TDLS_LINK_SETUP_RSP_WAIT_STATE, and
@@ -5122,7 +5134,7 @@ tSirRetStatus limProcessSmeTdlsMgmtSendReq(tpAniSirGlobal pMac,
break;
case SIR_MAC_TDLS_SETUP_CNF:
{
- limSendTdlsLinkSetupCnfFrame(pMac, pSendMgmtReq->peerMac, pSendMgmtReq->dialog,
+ limSendTdlsLinkSetupCnfFrame(pMac, pSendMgmtReq->peerMac, pSendMgmtReq->dialog, pSendMgmtReq->peerCapability,
psessionEntry, &pSendMgmtReq->addIe[0], (pSendMgmtReq->length - sizeof(tSirTdlsSendMgmtReq)));
resultCode = eSIR_SME_SUCCESS;
}
diff --git a/CORE/MAC/src/pe/pmm/pmmApi.c b/CORE/MAC/src/pe/pmm/pmmApi.c
index 591b3d6b2bc7..1c97ad2ed0b8 100644
--- a/CORE/MAC/src/pe/pmm/pmmApi.c
+++ b/CORE/MAC/src/pe/pmm/pmmApi.c
@@ -3182,38 +3182,85 @@ tSirRetStatus pmmOffloadEnterBmpsRespHandler(tpAniSirGlobal pMac,
eHalStatus pmmOffloadFillUapsdParams(tpPESession psessionEntry,
tpUapsd_Params pUapsdParams)
{
- tANI_U8 uapsdDeliveryMask = 0;
- tANI_U8 uapsdTriggerMask = 0;
-
- uapsdDeliveryMask = (psessionEntry->gUapsdPerAcBitmask |
- psessionEntry->gUapsdPerAcDeliveryEnableMask);
-
- uapsdTriggerMask = (psessionEntry->gUapsdPerAcBitmask |
- psessionEntry->gUapsdPerAcTriggerEnableMask);
-
- pUapsdParams->bkDeliveryEnabled =
- LIM_UAPSD_GET(ACBK, uapsdDeliveryMask);
-
- pUapsdParams->beDeliveryEnabled =
- LIM_UAPSD_GET(ACBE, uapsdDeliveryMask);
-
- pUapsdParams->viDeliveryEnabled =
- LIM_UAPSD_GET(ACVI, uapsdDeliveryMask);
+ /*
+ * If gAcAdmitMask[SIR_MAC_DIRECTION_DLINK] is set,DeliveryEnabled bits are filled
+ * based on PSB from addts dynamically. If it is not set, DeliveryEnabled bits are
+ * filled from static values as per UapsdMask in ini file.
+ */
- pUapsdParams->voDeliveryEnabled =
- LIM_UAPSD_GET(ACVO, uapsdDeliveryMask);
+ if ( psessionEntry->gAcAdmitMask[SIR_MAC_DIRECTION_DNLINK] & LIM_ADMIT_MASK_FLAG_ACBE)
+ {
+ pUapsdParams->beDeliveryEnabled = LIM_UAPSD_GET(ACBE, psessionEntry->gUapsdPerAcDeliveryEnableMask);
+ }
+ else
+ {
+ pUapsdParams->beDeliveryEnabled = LIM_UAPSD_GET(ACBE, psessionEntry->gUapsdPerAcBitmask);
+ }
+ if ( psessionEntry->gAcAdmitMask[SIR_MAC_DIRECTION_DNLINK] & LIM_ADMIT_MASK_FLAG_ACBK)
+ {
+ pUapsdParams->bkDeliveryEnabled = LIM_UAPSD_GET(ACBK, psessionEntry->gUapsdPerAcDeliveryEnableMask);
+ }
+ else
+ {
+ pUapsdParams->bkDeliveryEnabled = LIM_UAPSD_GET(ACBK, psessionEntry->gUapsdPerAcBitmask);
+ }
+ if ( psessionEntry->gAcAdmitMask[SIR_MAC_DIRECTION_DNLINK] & LIM_ADMIT_MASK_FLAG_ACVI)
+ {
+ pUapsdParams->viDeliveryEnabled = LIM_UAPSD_GET(ACVI, psessionEntry->gUapsdPerAcDeliveryEnableMask);
+ }
+ else
+ {
+ pUapsdParams->viDeliveryEnabled = LIM_UAPSD_GET(ACVI, psessionEntry->gUapsdPerAcBitmask);
+ }
- pUapsdParams->bkTriggerEnabled =
- LIM_UAPSD_GET(ACBK, uapsdTriggerMask);
+ if ( psessionEntry->gAcAdmitMask[SIR_MAC_DIRECTION_DNLINK] & LIM_ADMIT_MASK_FLAG_ACVO)
+ {
+ pUapsdParams->voDeliveryEnabled = LIM_UAPSD_GET(ACVO, psessionEntry->gUapsdPerAcDeliveryEnableMask);
+ }
+ else
+ {
+ pUapsdParams->voDeliveryEnabled = LIM_UAPSD_GET(ACVO, psessionEntry->gUapsdPerAcBitmask);
+ }
- pUapsdParams->beTriggerEnabled =
- LIM_UAPSD_GET(ACBE, uapsdTriggerMask);
+ /*
+ * If gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] is set,TriggerEnabled bits are filled
+ * based on PSB from addts dynamically. If it is not set, TriggerEnabled bits are
+ * filled from static values as per UapsdMask in ini file.
+ */
- pUapsdParams->viTriggerEnabled =
- LIM_UAPSD_GET(ACVI, uapsdTriggerMask);
+ if ( psessionEntry->gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] & LIM_ADMIT_MASK_FLAG_ACBE)
+ {
+ pUapsdParams->beTriggerEnabled = LIM_UAPSD_GET(ACBE, psessionEntry->gUapsdPerAcTriggerEnableMask);
+ }
+ else
+ {
+ pUapsdParams->beTriggerEnabled = LIM_UAPSD_GET(ACBE, psessionEntry->gUapsdPerAcBitmask);
+ }
+ if ( psessionEntry->gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] & LIM_ADMIT_MASK_FLAG_ACBK)
+ {
+ pUapsdParams->bkTriggerEnabled = LIM_UAPSD_GET(ACBK, psessionEntry->gUapsdPerAcTriggerEnableMask);
+ }
+ else
+ {
+ pUapsdParams->bkTriggerEnabled = LIM_UAPSD_GET(ACBK, psessionEntry->gUapsdPerAcBitmask);
+ }
+ if ( psessionEntry->gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] & LIM_ADMIT_MASK_FLAG_ACVI)
+ {
+ pUapsdParams->viTriggerEnabled = LIM_UAPSD_GET(ACVI, psessionEntry->gUapsdPerAcTriggerEnableMask);
+ }
+ else
+ {
+ pUapsdParams->viTriggerEnabled = LIM_UAPSD_GET(ACVI, psessionEntry->gUapsdPerAcBitmask);
+ }
- pUapsdParams->voTriggerEnabled =
- LIM_UAPSD_GET(ACVO, uapsdTriggerMask);
+ if ( psessionEntry->gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] & LIM_ADMIT_MASK_FLAG_ACVO)
+ {
+ pUapsdParams->voTriggerEnabled = LIM_UAPSD_GET(ACVO, psessionEntry->gUapsdPerAcTriggerEnableMask);
+ }
+ else
+ {
+ pUapsdParams->voTriggerEnabled = LIM_UAPSD_GET(ACVO, psessionEntry->gUapsdPerAcBitmask);
+ }
return eHAL_STATUS_SUCCESS;
}
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 0e7b69d363eb..15abb3f2ad9e 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -1035,7 +1035,7 @@ static void wma_delete_all_ap_remote_peers(tp_wma_handle wma, A_UINT32 vdev_id)
if (peer != TAILQ_FIRST(&vdev->peer_list)) {
adf_os_atomic_init(&peer->ref_cnt);
adf_os_atomic_inc(&peer->ref_cnt);
- wma_remove_peer(wma, wma->interfaces[vdev_id].bssid,
+ wma_remove_peer(wma, peer->mac_addr.raw,
vdev_id, peer);
}
}
@@ -1372,12 +1372,18 @@ static void wma_update_peer_stats(tp_wma_handle wma, wmi_peer_stats *peer_stats)
peer_stats->peer_tx_rate/500;
}
- WMA_LOGD("peer tx rate flags:%d nss:%d",
- node->rate_flags, node->nss);
classa_stats->tx_rate_flags = node->rate_flags;
/*rx_frag_cnt parameter is currently not used.
*lets use the same parameter to hold the nss value*/
classa_stats->rx_frag_cnt = node->nss;
+
+ /* FW returns tx power in intervals of 0.5 dBm
+ Convert it back to intervals of 1 dBm */
+ classa_stats->max_pwr =
+ roundup(classa_stats->max_pwr, 2) >> 1;
+ WMA_LOGD("peer tx rate flags:%d nss:%d max_txpwr:%d",
+ node->rate_flags, node->nss,
+ classa_stats->max_pwr);
}
if (node->fw_stats_set & FW_STATS_SET) {
@@ -7359,6 +7365,41 @@ static int32_t wmi_unified_set_sta_ps_param(wmi_unified_t wmi_handle,
return 0;
}
+#ifdef FEATURE_GREEN_AP
+static int32_t wmi_unified_pdev_green_ap_ps_enable_cmd(wmi_unified_t wmi_handle,
+ u_int32_t value)
+{
+ wmi_pdev_green_ap_ps_enable_cmd_fixed_param *cmd;
+ wmi_buf_t buf;
+ int32_t len = sizeof(*cmd);
+
+ WMA_LOGD("Set Green AP PS val %d", value);
+
+ buf = wmi_buf_alloc(wmi_handle, len);
+ if (!buf) {
+ WMA_LOGP("%s: Green AP PS Mem Alloc Failed", __func__);
+ return -ENOMEM;
+ }
+
+ cmd = (wmi_pdev_green_ap_ps_enable_cmd_fixed_param *) wmi_buf_data(buf);
+ WMITLV_SET_HDR(&cmd->tlv_header,
+ WMITLV_TAG_STRUC_wmi_pdev_green_ap_ps_enable_cmd_fixed_param,
+ WMITLV_GET_STRUCT_TLVLEN(
+ wmi_pdev_green_ap_ps_enable_cmd_fixed_param));
+ cmd->reserved0 = 0;
+ cmd->enable = value;
+
+ if (wmi_unified_cmd_send(wmi_handle, buf, len,
+ WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID)) {
+ WMA_LOGE("Set Green AP PS param Failed val %d", value);
+
+ adf_nbuf_free(buf);
+ return -EIO;
+ }
+ return 0;
+}
+#endif /* FEATURE_GREEN_AP */
+
static int
wmi_unified_vdev_set_gtx_cfg_send(wmi_unified_t wmi_handle, u_int32_t if_id,
gtx_config_t *gtx_info)
@@ -7577,6 +7618,17 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
WMA_LOGE("dbglog_report_enable"
" failed ret %d", ret);
break;
+#ifdef FEATURE_GREEN_AP
+ case WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID:
+ /* Set the Green AP */
+ ret = wmi_unified_pdev_green_ap_ps_enable_cmd(wma->wmi_handle,
+ privcmd->param_value);
+ if (ret) {
+ WMA_LOGE("Set GreenAP Failed val %d", privcmd->param_value);
+ }
+ break;
+#endif /* FEATURE_GREEN_AP */
+
default:
WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
break;
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 23beb757501e..824632973e2f 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -1431,6 +1431,7 @@ typedef struct tagCsrTdlsSendMgmt
tANI_U8 dialog;
tANI_U16 statusCode;
tANI_U8 responder;
+ tANI_U32 peerCapability;
tANI_U8 *buf;
tANI_U8 len;
diff --git a/CORE/SME/inc/smeInside.h b/CORE/SME/inc/smeInside.h
index 1453d954910f..fe4003b3939b 100644
--- a/CORE/SME/inc/smeInside.h
+++ b/CORE/SME/inc/smeInside.h
@@ -113,6 +113,7 @@ typedef struct TdlsSendMgmtInfo
tANI_U8 dialog;
tANI_U16 statusCode;
tANI_U8 responder;
+ tANI_U32 peerCapability;
tANI_U8 *buf;
tANI_U8 len;
} tTdlsSendMgmtCmdInfo;
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index a1643120aec7..1b176c0620ca 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -3166,13 +3166,14 @@ VOS_STATUS sme_SendTdlsLinkEstablishParams(tHalHandle hHal,
\param frame_type - Type of TDLS mgmt frame to be sent.
\param dialog - dialog token used in the frame.
\param status - status to be incuded in the frame.
+ \param peerCapability - peerCapability to be incuded in the frame.
\param buf - additional IEs to be included
\param len - lenght of additional Ies
\param responder - Tdls request type
\- return VOS_STATUS_SUCCES
-------------------------------------------------------------------------*/
VOS_STATUS sme_SendTdlsMgmtFrame(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac,
- tANI_U8 frame_type, tANI_U8 dialog, tANI_U16 status, tANI_U8 *buf, tANI_U8 len, tANI_U8 responder);
+ tANI_U8 frame_type, tANI_U8 dialog, tANI_U16 status, tANI_U32 peerCapability, tANI_U8 *buf, tANI_U8 len, tANI_U8 responder);
/* ---------------------------------------------------------------------------
\fn sme_ChangeTdlsPeerSta
\brief API to Update TDLS peer sta parameters.
diff --git a/CORE/SME/src/csr/csrTdlsProcess.c b/CORE/SME/src/csr/csrTdlsProcess.c
index 56b54c75942d..5ddd942c446e 100644
--- a/CORE/SME/src/csr/csrTdlsProcess.c
+++ b/CORE/SME/src/csr/csrTdlsProcess.c
@@ -121,6 +121,7 @@ eHalStatus csrTdlsSendMgmtReq(tHalHandle hHal, tANI_U8 sessionId, tCsrTdlsSendMg
tdlsSendMgmtCmdInfo->dialog = tdlsSendMgmt->dialog ;
tdlsSendMgmtCmdInfo->statusCode = tdlsSendMgmt->statusCode ;
tdlsSendMgmtCmdInfo->responder = tdlsSendMgmt->responder;
+ tdlsSendMgmtCmdInfo->peerCapability = tdlsSendMgmt->peerCapability;
vos_mem_copy(tdlsSendMgmtCmdInfo->peerMac,
tdlsSendMgmt->peerMac, sizeof(tSirMacAddr)) ;
@@ -500,6 +501,7 @@ eHalStatus csrTdlsProcessSendMgmt( tpAniSirGlobal pMac, tSmeCmd *cmd )
tdlsSendMgmtReq->dialog = tdlsSendMgmtCmdInfo->dialog ;
tdlsSendMgmtReq->statusCode = tdlsSendMgmtCmdInfo->statusCode ;
tdlsSendMgmtReq->responder = tdlsSendMgmtCmdInfo->responder;
+ tdlsSendMgmtReq->peerCapability = tdlsSendMgmtCmdInfo->peerCapability;
vos_mem_copy(tdlsSendMgmtReq->bssid,
pSession->pConnectBssDesc->bssId, sizeof (tSirMacAddr));
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 5357ba5d081f..0fec71b4e83a 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -10382,8 +10382,8 @@ tANI_U8 sme_IsFeatureSupportedByFW(tANI_U8 featEnumValue)
#ifdef FEATURE_WLAN_TDLS
/* ---------------------------------------------------------------------------
- \fn sme_SendTdlsMgmtFrame
- \brief API to send TDLS management frames.
+ \fn sme_SendTdlsLinkEstablishParams
+ \brief API to send TDLS Peer Link Establishment Parameters.
\param peerMac - peer's Mac Adress.
\param tdlsLinkEstablishParams - TDLS Peer Link Establishment Parameters
@@ -10415,13 +10415,17 @@ VOS_STATUS sme_SendTdlsLinkEstablishParams(tHalHandle hHal,
\param frame_type - Type of TDLS mgmt frame to be sent.
\param dialog - dialog token used in the frame.
\param status - status to be incuded in the frame.
+ \param peerCapability - peer cpabilities
\param buf - additional IEs to be included
\param len - lenght of additional Ies
\param responder - Tdls request type
\- return VOS_STATUS_SUCCES
-------------------------------------------------------------------------*/
-VOS_STATUS sme_SendTdlsMgmtFrame(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac,
- tANI_U8 frame_type, tANI_U8 dialog, tANI_U16 statusCode, tANI_U8 *buf, tANI_U8 len, tANI_U8 responder)
+VOS_STATUS sme_SendTdlsMgmtFrame(tHalHandle hHal, tANI_U8 sessionId,
+ tSirMacAddr peerMac, tANI_U8 frame_type,
+ tANI_U8 dialog, tANI_U16 statusCode,
+ tANI_U32 peerCapability, tANI_U8 *buf,
+ tANI_U8 len, tANI_U8 responder)
{
eHalStatus status = eHAL_STATUS_SUCCESS;
tCsrTdlsSendMgmt sendTdlsReq = {{0}} ;
@@ -10437,6 +10441,7 @@ VOS_STATUS sme_SendTdlsMgmtFrame(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr
sendTdlsReq.dialog = dialog;
sendTdlsReq.statusCode = statusCode;
sendTdlsReq.responder = responder;
+ sendTdlsReq.peerCapability = peerCapability;
status = csrTdlsSendMgmtReq(hHal, sessionId, &sendTdlsReq) ;
diff --git a/Kbuild b/Kbuild
index 74c4d6e08190..c7e2bd854105 100644
--- a/Kbuild
+++ b/Kbuild
@@ -1176,16 +1176,26 @@ CDEFINES += -DQCA_CONFIG_SMP
endif
endif
-#enable wlan auto shutdown feature for mdm9630
+#features specific to mdm9630
ifeq ($(CONFIG_ARCH_MDM9630), y)
-CDEFINES += -DFEATURE_WLAN_AUTO_SHUTDOWN -DFEATURE_WLAN_MCC_TO_SCC_SWITCH
-endif
-#Open P2P device interface only for non-MDM9630 platform
-ifeq ($(CONFIG_ARCH_MDM9630), y)
+#enable MCC TO SCC switch
+CDEFINES += -DFEATURE_WLAN_MCC_TO_SCC_SWITCH
+
+#enable wlan auto shutdown feature for mdm9630
+CDEFINES += -DFEATURE_WLAN_AUTO_SHUTDOWN
+
+#enable for MBSSID
CDEFINES += -DWLAN_FEATURE_MBSSID
+
+#Green AP feature
+CDEFINES += -DFEATURE_GREEN_AP
+
else
+
+#Open P2P device interface only for non-MDM9630 platform
CDEFINES += -DWLAN_OPEN_P2P_INTERFACE
+
endif
#Enable Signed firmware support for split binary format