diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2014-04-19 04:21:28 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2014-04-19 04:21:28 -0700 |
| commit | dd3c9d5cfc90938634c2adf36f8bfb29cb8706f2 (patch) | |
| tree | 122c5017dd5fea73f279ce1fbec8ca93a5e97794 | |
| parent | 6086f4555c509688a94045c997887189032f78a5 (diff) | |
| parent | fb8c7af33e2c2d74c781d3c74ba9e6bd14cfd201 (diff) | |
Merge "Release 1.0.0.96 QCACLD WLAN Driver"
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_main.h | 72 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg80211.c | 17 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_hostapd.c | 18 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_main.c | 274 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_softap_tx_rx.c | 41 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_tdls.c | 3 | ||||
| -rw-r--r-- | CORE/MAC/inc/qwlan_version.h | 4 | ||||
| -rw-r--r-- | CORE/MAC/inc/sirApi.h | 1 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c | 12 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limProcessTdls.c | 32 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/pmm/pmmApi.c | 101 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 58 | ||||
| -rw-r--r-- | CORE/SME/inc/csrApi.h | 1 | ||||
| -rw-r--r-- | CORE/SME/inc/smeInside.h | 1 | ||||
| -rw-r--r-- | CORE/SME/inc/sme_Api.h | 3 | ||||
| -rw-r--r-- | CORE/SME/src/csr/csrTdlsProcess.c | 2 | ||||
| -rw-r--r-- | CORE/SME/src/sme_common/sme_Api.c | 13 | ||||
| -rw-r--r-- | Kbuild | 20 |
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) ; @@ -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 |
