|
@@ -587,12 +587,6 @@ void lim_deactivate_timers(tpAniSirGlobal mac_ctx)
|
|
|
/* Deactivate wait-for-probe-after-Heartbeat timer. */
|
|
|
tx_timer_deactivate(&lim_timer->gLimProbeAfterHBTimer);
|
|
|
|
|
|
- /* Deactivate and delete Quiet timer. */
|
|
|
- tx_timer_deactivate(&lim_timer->gLimQuietTimer);
|
|
|
-
|
|
|
- /* Deactivate Quiet BSS timer. */
|
|
|
- tx_timer_deactivate(&lim_timer->gLimQuietBssTimer);
|
|
|
-
|
|
|
/* Deactivate cnf wait timer */
|
|
|
for (n = 0; n < (mac_ctx->lim.maxStation + 1); n++) {
|
|
|
tx_timer_deactivate(&lim_timer->gpLimCnfWaitTimer[n]);
|
|
@@ -669,12 +663,6 @@ void lim_cleanup_mlm(tpAniSirGlobal mac_ctx)
|
|
|
/* Delete wait-for-probe-after-Heartbeat timer. */
|
|
|
tx_timer_delete(&lim_timer->gLimProbeAfterHBTimer);
|
|
|
|
|
|
- /* Delete Quiet timer. */
|
|
|
- tx_timer_delete(&lim_timer->gLimQuietTimer);
|
|
|
-
|
|
|
- /* Delete Quiet BSS timer. */
|
|
|
- tx_timer_delete(&lim_timer->gLimQuietBssTimer);
|
|
|
-
|
|
|
/* Delete cnf wait timer */
|
|
|
for (n = 0; n < (mac_ctx->lim.maxStation + 1); n++) {
|
|
|
tx_timer_delete(&lim_timer->gpLimCnfWaitTimer[n]);
|
|
@@ -2206,285 +2194,6 @@ void lim_cancel_dot11h_channel_switch(tpAniSirGlobal pMac,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * lim_cancel_dot11h_quiet()
|
|
|
- *
|
|
|
- * @mac_ctx: pointer to global mac structure
|
|
|
- * @psession_entry: pointer to tppesession
|
|
|
- *
|
|
|
- * Cancel the quieting on Station if latest beacon
|
|
|
- * doesn't contain quiet IE in it.
|
|
|
- *
|
|
|
- * Return: none
|
|
|
- */
|
|
|
-void lim_cancel_dot11h_quiet(tpAniSirGlobal pMac, tpPESession psessionEntry)
|
|
|
-{
|
|
|
- if (!LIM_IS_STA_ROLE(psessionEntry))
|
|
|
- return;
|
|
|
-
|
|
|
- if (psessionEntry->gLimSpecMgmt.quietState == eLIM_QUIET_BEGIN) {
|
|
|
- MTRACE(mac_trace
|
|
|
- (pMac, TRACE_CODE_TIMER_DEACTIVATE,
|
|
|
- psessionEntry->peSessionId, eLIM_QUIET_TIMER));
|
|
|
- if (tx_timer_deactivate(&pMac->lim.limTimers.gLimQuietTimer) !=
|
|
|
- TX_SUCCESS) {
|
|
|
- pe_err("tx_timer_deactivate failed");
|
|
|
- }
|
|
|
- } else if (psessionEntry->gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING) {
|
|
|
- MTRACE(mac_trace
|
|
|
- (pMac, TRACE_CODE_TIMER_DEACTIVATE,
|
|
|
- psessionEntry->peSessionId, eLIM_QUIET_BSS_TIMER));
|
|
|
- if (tx_timer_deactivate(&pMac->lim.limTimers.gLimQuietBssTimer)
|
|
|
- != TX_SUCCESS) {
|
|
|
- pe_err("tx_timer_deactivate failed");
|
|
|
- }
|
|
|
- /**
|
|
|
- * If the channel switch is already running in silent mode, dont resume the
|
|
|
- * transmission. Channel switch timer when timeout, transmission will be resumed.
|
|
|
- */
|
|
|
- if (!
|
|
|
- ((psessionEntry->gLimSpecMgmt.dot11hChanSwState ==
|
|
|
- eLIM_11H_CHANSW_RUNNING)
|
|
|
- && (psessionEntry->gLimChannelSwitch.switchMode ==
|
|
|
- eSIR_CHANSW_MODE_SILENT))) {
|
|
|
- lim_frame_transmission_control(pMac, eLIM_TX_ALL,
|
|
|
- eLIM_RESUME_TX);
|
|
|
- lim_restore_pre_quiet_state(pMac, psessionEntry);
|
|
|
- }
|
|
|
- }
|
|
|
- psessionEntry->gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * lim_process_quiet_timeout
|
|
|
- *
|
|
|
- * FUNCTION:
|
|
|
- * This function is active only on the STA.
|
|
|
- * Handles SIR_LIM_QUIET_TIMEOUT
|
|
|
- *
|
|
|
- * LOGIC:
|
|
|
- * This timeout can occur under only one circumstance:
|
|
|
- *
|
|
|
- * 1) When gLimQuietState = eLIM_QUIET_BEGIN
|
|
|
- * This indicates that the timeout "interval" has
|
|
|
- * expired. This is a trigger for the STA to now
|
|
|
- * shut-off Tx/Rx for the specified gLimQuietDuration
|
|
|
- * -> The TIMER object gLimQuietBssTimer is
|
|
|
- * activated
|
|
|
- * -> With timeout = gLimQuietDuration
|
|
|
- * -> gLimQuietState is set to eLIM_QUIET_RUNNING
|
|
|
- *
|
|
|
- * ASSUMPTIONS:
|
|
|
- * Using two TIMER objects -
|
|
|
- * gLimQuietTimer & gLimQuietBssTimer
|
|
|
- *
|
|
|
- * NOTE:
|
|
|
- *
|
|
|
- * @param pMac - Pointer to Global MAC structure
|
|
|
- *
|
|
|
- * @return None
|
|
|
- */
|
|
|
-void lim_process_quiet_timeout(tpAniSirGlobal pMac)
|
|
|
-{
|
|
|
- tpPESession psessionEntry;
|
|
|
-
|
|
|
- psessionEntry = pe_find_session_by_session_id(pMac,
|
|
|
- pMac->lim.limTimers.gLimQuietTimer.sessionId);
|
|
|
- if (psessionEntry == NULL) {
|
|
|
- pe_err("Session Does not exist for given sessionID");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- pe_debug("quietState: %d", psessionEntry->gLimSpecMgmt.quietState);
|
|
|
- switch (psessionEntry->gLimSpecMgmt.quietState) {
|
|
|
- case eLIM_QUIET_BEGIN:
|
|
|
- /* Time to Stop data traffic for quietDuration */
|
|
|
- /* lim_deactivate_and_change_timer(pMac, eLIM_QUIET_BSS_TIMER); */
|
|
|
- if (TX_SUCCESS != tx_timer_deactivate(
|
|
|
- &pMac->lim.limTimers.gLimQuietBssTimer)) {
|
|
|
- pe_err("Unable to de-activate gLimQuietBssTimer! Will attempt to activate anyway");
|
|
|
- }
|
|
|
- /* gLimQuietDuration appears to be in units of ticks */
|
|
|
- /* Use it as is */
|
|
|
- if (TX_SUCCESS !=
|
|
|
- tx_timer_change(&pMac->lim.limTimers.gLimQuietBssTimer,
|
|
|
- psessionEntry->gLimSpecMgmt.quietDuration,
|
|
|
- 0)) {
|
|
|
- pe_err("Unable to change gLimQuietBssTimer! Will still attempt to activate anyway");
|
|
|
- }
|
|
|
- MTRACE(mac_trace
|
|
|
- (pMac, TRACE_CODE_TIMER_ACTIVATE,
|
|
|
- pMac->lim.limTimers.gLimQuietTimer.sessionId,
|
|
|
- eLIM_QUIET_BSS_TIMER));
|
|
|
- if (TX_SUCCESS !=
|
|
|
- tx_timer_activate(&pMac->lim.limTimers.gLimQuietBssTimer)) {
|
|
|
- pe_warn("Unable to activate gLimQuietBssTimer! The STA will be unable to honor Quiet BSS");
|
|
|
- } else {
|
|
|
- /* Transition to eLIM_QUIET_RUNNING */
|
|
|
- psessionEntry->gLimSpecMgmt.quietState =
|
|
|
- eLIM_QUIET_RUNNING;
|
|
|
- /* Shut-off Tx/Rx for gLimSpecMgmt.quietDuration */
|
|
|
- /* freeze the transmission */
|
|
|
- lim_frame_transmission_control(pMac, eLIM_TX_ALL,
|
|
|
- eLIM_STOP_TX);
|
|
|
-
|
|
|
- pe_debug("Quiet BSS: STA shutting down for %d ticks",
|
|
|
- psessionEntry->gLimSpecMgmt.quietDuration);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case eLIM_QUIET_RUNNING:
|
|
|
- case eLIM_QUIET_INIT:
|
|
|
- case eLIM_QUIET_END:
|
|
|
- default:
|
|
|
- /* */
|
|
|
- /* As of now, nothing to be done */
|
|
|
- /* */
|
|
|
- break;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * lim_process_quiet_bss_timeout() - Handles SIR_LIM_QUIET_BSS_TIMEOUT
|
|
|
- * @mac_ctx: pointer to Globale Mac Structure
|
|
|
- *
|
|
|
- * This function is active on the AP and STA.
|
|
|
- * Handles SIR_LIM_QUIET_BSS_TIMEOUT
|
|
|
- *
|
|
|
- * On the AP -
|
|
|
- * When the SIR_LIM_QUIET_BSS_TIMEOUT is triggered, it is
|
|
|
- * an indication for the AP to START sending out the
|
|
|
- * Quiet BSS IE.
|
|
|
- * If 802.11H is enabled, the Quiet BSS IE is sent as per
|
|
|
- * the 11H spec
|
|
|
- * If 802.11H is not enabled, the Quiet BSS IE is sent as
|
|
|
- * a Proprietary IE. This will be understood by all the
|
|
|
- * TITAN STA's
|
|
|
- * Transitioning gLimQuietState to eLIM_QUIET_BEGIN will
|
|
|
- * initiate the SCH to include the Quiet BSS IE in all
|
|
|
- * its subsequent Beacons/PR's.
|
|
|
- * The Quiet BSS IE will be included in all the Beacons
|
|
|
- * & PR's until the next DTIM period
|
|
|
- *
|
|
|
- * On the STA -
|
|
|
- * When gLimQuietState = eLIM_QUIET_RUNNING
|
|
|
- * This indicates that the STA was successfully shut-off
|
|
|
- * for the specified gLimQuietDuration. This is a trigger
|
|
|
- * for the STA to now resume data traffic.
|
|
|
- * -> gLimQuietState is set to eLIM_QUIET_INIT
|
|
|
- *
|
|
|
- *
|
|
|
- * Return: none
|
|
|
- */
|
|
|
-void lim_process_quiet_bss_timeout(tpAniSirGlobal mac_ctx)
|
|
|
-{
|
|
|
- tpPESession psession_entry = NULL;
|
|
|
- tLimTimers *lim_timer = &mac_ctx->lim.limTimers;
|
|
|
-
|
|
|
- psession_entry = pe_find_session_by_session_id(mac_ctx,
|
|
|
- lim_timer->gLimQuietBssTimer.sessionId);
|
|
|
-
|
|
|
- if (psession_entry == NULL) {
|
|
|
- pe_err("Session Does not exist for given sessionID");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- pe_debug("quietState: %d",
|
|
|
- psession_entry->gLimSpecMgmt.quietState);
|
|
|
-
|
|
|
- if (LIM_IS_AP_ROLE(psession_entry))
|
|
|
- return;
|
|
|
-
|
|
|
- /* eLIM_STA_ROLE */
|
|
|
- switch (psession_entry->gLimSpecMgmt.quietState) {
|
|
|
- case eLIM_QUIET_RUNNING:
|
|
|
- /* Transition to eLIM_QUIET_INIT */
|
|
|
- psession_entry->gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
|
|
|
-
|
|
|
- /*
|
|
|
- * Resume data traffic only if channel switch is
|
|
|
- * not running in silent mode.
|
|
|
- */
|
|
|
- if (!((psession_entry->gLimSpecMgmt.dot11hChanSwState ==
|
|
|
- eLIM_11H_CHANSW_RUNNING) &&
|
|
|
- (psession_entry->gLimChannelSwitch.switchMode ==
|
|
|
- eSIR_CHANSW_MODE_SILENT))) {
|
|
|
- lim_frame_transmission_control(mac_ctx, eLIM_TX_ALL,
|
|
|
- eLIM_RESUME_TX);
|
|
|
- lim_restore_pre_quiet_state(mac_ctx, psession_entry);
|
|
|
- }
|
|
|
- pe_debug("Quiet BSS: Resuming traffic");
|
|
|
- break;
|
|
|
-
|
|
|
- case eLIM_QUIET_INIT:
|
|
|
- case eLIM_QUIET_BEGIN:
|
|
|
- case eLIM_QUIET_END:
|
|
|
- pe_debug("Quiet state not in RUNNING");
|
|
|
- /*
|
|
|
- * If the quiet period has ended, then resume the
|
|
|
- * frame transmission
|
|
|
- */
|
|
|
- lim_frame_transmission_control(mac_ctx, eLIM_TX_ALL,
|
|
|
- eLIM_RESUME_TX);
|
|
|
- lim_restore_pre_quiet_state(mac_ctx, psession_entry);
|
|
|
- psession_entry->gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- /* As of now, nothing to be done */
|
|
|
- break;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/**----------------------------------------------
|
|
|
- \fn lim_start_quiet_timer
|
|
|
- \brief Starts the quiet timer.
|
|
|
-
|
|
|
- \param pMac
|
|
|
- \return NONE
|
|
|
- -----------------------------------------------*/
|
|
|
-void lim_start_quiet_timer(tpAniSirGlobal pMac, uint8_t sessionId)
|
|
|
-{
|
|
|
- tpPESession psessionEntry;
|
|
|
-
|
|
|
- psessionEntry = pe_find_session_by_session_id(pMac, sessionId);
|
|
|
-
|
|
|
- if (psessionEntry == NULL) {
|
|
|
- pe_err("Session Does not exist for given sessionID");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (!LIM_IS_STA_ROLE(psessionEntry))
|
|
|
- return;
|
|
|
- /* First, de-activate Timer, if its already active */
|
|
|
- lim_cancel_dot11h_quiet(pMac, psessionEntry);
|
|
|
-
|
|
|
- MTRACE(mac_trace
|
|
|
- (pMac, TRACE_CODE_TIMER_ACTIVATE, sessionId, eLIM_QUIET_TIMER));
|
|
|
- if (TX_SUCCESS !=
|
|
|
- tx_timer_deactivate(&pMac->lim.limTimers.gLimQuietTimer)) {
|
|
|
- pe_err("Unable to deactivate gLimQuietTimer! Will still attempt to re-activate anyway");
|
|
|
- }
|
|
|
- /* Set the NEW timeout value, in ticks */
|
|
|
- if (TX_SUCCESS != tx_timer_change(&pMac->lim.limTimers.gLimQuietTimer,
|
|
|
- SYS_MS_TO_TICKS(psessionEntry->
|
|
|
- gLimSpecMgmt.
|
|
|
- quietTimeoutValue),
|
|
|
- 0)) {
|
|
|
- pe_err("Unable to change gLimQuietTimer! Will still attempt to re-activate anyway");
|
|
|
- }
|
|
|
-
|
|
|
- pMac->lim.limTimers.gLimQuietTimer.sessionId = sessionId;
|
|
|
- if (TX_SUCCESS !=
|
|
|
- tx_timer_activate(&pMac->lim.limTimers.gLimQuietTimer)) {
|
|
|
- pe_err("Unable to activate gLimQuietTimer! STA cannot honor Quiet BSS!");
|
|
|
- lim_restore_pre_quiet_state(pMac, psessionEntry);
|
|
|
-
|
|
|
- psessionEntry->gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
|
|
|
- return;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/** ------------------------------------------------------------------------ **/
|
|
|
/**
|
|
|
* keep track of the number of ANI peers associated in the BSS
|
|
@@ -4947,117 +4656,6 @@ bool lim_is_channel_valid_for_channel_switch(tpAniSirGlobal pMac, uint8_t channe
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-/**------------------------------------------------------
|
|
|
- \fn __lim_fill_tx_control_params
|
|
|
- \brief Fill the message for stopping/resuming tx.
|
|
|
-
|
|
|
- \param pMac
|
|
|
- \param pTxCtrlMsg - Pointer to tx control message.
|
|
|
- \param type - Which way we want to stop/ resume tx.
|
|
|
- \param mode - To stop/resume.
|
|
|
- -------------------------------------------------------*/
|
|
|
-static QDF_STATUS
|
|
|
-__lim_fill_tx_control_params(tpAniSirGlobal pMac, tpTxControlParams pTxCtrlMsg,
|
|
|
- tLimQuietTxMode type, tLimControlTx mode)
|
|
|
-{
|
|
|
-
|
|
|
- tpPESession psessionEntry = &pMac->lim.gpSession[0];
|
|
|
-
|
|
|
- if (mode == eLIM_STOP_TX)
|
|
|
- pTxCtrlMsg->stopTx = true;
|
|
|
- else
|
|
|
- pTxCtrlMsg->stopTx = false;
|
|
|
-
|
|
|
- switch (type) {
|
|
|
- case eLIM_TX_ALL:
|
|
|
- /** Stops/resumes transmission completely */
|
|
|
- pTxCtrlMsg->fCtrlGlobal = 1;
|
|
|
- break;
|
|
|
-
|
|
|
- case eLIM_TX_BSS_BUT_BEACON:
|
|
|
- /** Stops/resumes transmission on a particular BSS. Stopping BSS, doesn't
|
|
|
- * stop beacon transmission.
|
|
|
- */
|
|
|
- pTxCtrlMsg->ctrlBss = 1;
|
|
|
- pTxCtrlMsg->bssBitmap |= (1 << psessionEntry->bssIdx);
|
|
|
- break;
|
|
|
-
|
|
|
- case eLIM_TX_STA:
|
|
|
- /** Memory for station bitmap is allocated dynamically in caller of this
|
|
|
- * so decode properly here and fill the bitmap. Now not implemented,
|
|
|
- * fall through.
|
|
|
- */
|
|
|
- case eLIM_TX_BSS:
|
|
|
- /* Fall thru... */
|
|
|
- default:
|
|
|
- pe_warn("Invalid case: Not Handled");
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
-
|
|
|
- return QDF_STATUS_SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * @function : lim_frame_transmission_control()
|
|
|
- *
|
|
|
- * @brief : This API is called by the user to halt/resume any frame
|
|
|
- * transmission from the device. If stopped, all frames will be
|
|
|
- * queued starting from hardware. Then back-pressure
|
|
|
- * is built till the driver.
|
|
|
- * LOGIC:
|
|
|
- *
|
|
|
- * ASSUMPTIONS:
|
|
|
- * NA
|
|
|
- *
|
|
|
- * NOTE:
|
|
|
- * NA
|
|
|
- *
|
|
|
- * @param pMac - Pointer to Global MAC structure
|
|
|
- * @return None
|
|
|
- */
|
|
|
-void lim_frame_transmission_control(tpAniSirGlobal pMac, tLimQuietTxMode type,
|
|
|
- tLimControlTx mode)
|
|
|
-{
|
|
|
-
|
|
|
- QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
|
|
- tpTxControlParams pTxCtrlMsg;
|
|
|
- struct scheduler_msg msgQ = {0};
|
|
|
- uint8_t nBytes = 0; /* No of bytes required for station bitmap. */
|
|
|
-
|
|
|
- /** Allocate only required number of bytes for station bitmap
|
|
|
- * Make it to align to 4 byte boundary */
|
|
|
- nBytes = (uint8_t) HALMSG_NUMBYTES_STATION_BITMAP(pMac->lim.maxStation);
|
|
|
-
|
|
|
- pTxCtrlMsg = qdf_mem_malloc(sizeof(*pTxCtrlMsg) + nBytes);
|
|
|
- if (!pTxCtrlMsg)
|
|
|
- return;
|
|
|
-
|
|
|
- status = __lim_fill_tx_control_params(pMac, pTxCtrlMsg, type, mode);
|
|
|
- if (status != QDF_STATUS_SUCCESS) {
|
|
|
- qdf_mem_free(pTxCtrlMsg);
|
|
|
- pe_err("__lim_fill_tx_control_params failed, status: %d",
|
|
|
- status);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- msgQ.bodyptr = (void *)pTxCtrlMsg;
|
|
|
- msgQ.bodyval = 0;
|
|
|
- msgQ.reserved = 0;
|
|
|
- msgQ.type = WMA_TRANSMISSION_CONTROL_IND;
|
|
|
-
|
|
|
- MTRACE(mac_trace_msg_tx(pMac, NO_SESSION, msgQ.type));
|
|
|
- if (wma_post_ctrl_msg(pMac, &msgQ) != QDF_STATUS_SUCCESS) {
|
|
|
- qdf_mem_free(pTxCtrlMsg);
|
|
|
- pe_err("Posting Message to HAL failed");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- pe_debug("Stopping the transmission of all packets, indicated softmac tx_control: %d",
|
|
|
- mode);
|
|
|
-
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* @function : lim_restore_pre_channel_switch_state()
|
|
|
*
|
|
@@ -5088,35 +4686,6 @@ lim_restore_pre_channel_switch_state(tpAniSirGlobal pMac, tpPESession psessionEn
|
|
|
/* Channel switch should be ready for the next time */
|
|
|
psessionEntry->gLimSpecMgmt.dot11hChanSwState = eLIM_11H_CHANSW_INIT;
|
|
|
|
|
|
- /* Restore the frame transmission, all the time. */
|
|
|
- lim_frame_transmission_control(pMac, eLIM_TX_ALL, eLIM_RESUME_TX);
|
|
|
-
|
|
|
- return retCode;
|
|
|
-}
|
|
|
-
|
|
|
-/**--------------------------------------------
|
|
|
- \fn lim_restore_pre_quiet_state
|
|
|
- \brief Restore the pre quiet state
|
|
|
-
|
|
|
- \param pMac
|
|
|
- \return NONE
|
|
|
- ---------------------------------------------*/
|
|
|
-QDF_STATUS lim_restore_pre_quiet_state(tpAniSirGlobal pMac,
|
|
|
- tpPESession psessionEntry)
|
|
|
-{
|
|
|
-
|
|
|
- QDF_STATUS retCode = QDF_STATUS_SUCCESS;
|
|
|
-
|
|
|
- if (pMac->lim.gLimSystemRole != eLIM_STA_ROLE)
|
|
|
- return retCode;
|
|
|
-
|
|
|
- /* Quiet should be ready for the next time */
|
|
|
- psessionEntry->gLimSpecMgmt.quietState = eLIM_QUIET_INIT;
|
|
|
-
|
|
|
- /* Restore the frame transmission, all the time. */
|
|
|
- if (psessionEntry->gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING)
|
|
|
- lim_frame_transmission_control(pMac, eLIM_TX_ALL, eLIM_RESUME_TX);
|
|
|
-
|
|
|
return retCode;
|
|
|
}
|
|
|
|