diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2014-09-06 00:59:06 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2014-09-06 00:59:06 -0700 |
| commit | 95b5f88f4905df0b6ea417a04feb4a623eb68cc4 (patch) | |
| tree | 358f28202e0b015ab28790f3f171b6892ea142ce | |
| parent | 3ef450c9991e7fbae1a7e3986d3e0bc2848034dc (diff) | |
| parent | 4c9215995004dbd49fad19079b210381b5f67cd2 (diff) | |
Merge "Release 1.0.0.184A QCACLD WLAN Drive"
| -rw-r--r-- | CORE/CLD_TXRX/HTT/htt_rx.c | 6 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_rx.c | 3 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_ipa.c | 54 | ||||
| -rw-r--r-- | CORE/MAC/inc/qwlan_version.h | 2 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limAssocUtils.c | 3 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c | 19 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limSendManagementFrames.c | 3 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limUtils.c | 3 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/sch/schBeaconProcess.c | 6 | ||||
| -rw-r--r-- | CORE/SAP/inc/sapApi.h | 8 | ||||
| -rw-r--r-- | CORE/SAP/src/sapChSelect.h | 29 | ||||
| -rw-r--r-- | CORE/SAP/src/sapFsm.c | 654 | ||||
| -rw-r--r-- | CORE/SAP/src/sapInternal.h | 6 | ||||
| -rw-r--r-- | CORE/SERVICES/HIF/PCIe/if_pci.c | 2 | ||||
| -rw-r--r-- | CORE/SME/src/csr/csrApiRoam.c | 13 | ||||
| -rw-r--r-- | CORE/SME/src/sme_common/sme_Api.c | 15 |
16 files changed, 572 insertions, 254 deletions
diff --git a/CORE/CLD_TXRX/HTT/htt_rx.c b/CORE/CLD_TXRX/HTT/htt_rx.c index c7dfc98f7019..b28457aaf425 100644 --- a/CORE/CLD_TXRX/HTT/htt_rx.c +++ b/CORE/CLD_TXRX/HTT/htt_rx.c @@ -960,7 +960,7 @@ htt_rx_amsdu_pop_ll( adf_nbuf_set_next(msdu, NULL); *tail_msdu = msdu; pdev->rx_ring.rx_reset = 1; - return msdu_chained; + return msdu_chaining; #else process_wma_set_command(0,(int)GEN_PARAM_CRASH_INJECT, 0, GEN_CMD); @@ -2402,6 +2402,10 @@ htt_rx_attach(struct htt_pdev_t *pdev) pdev->rx_ring.dbg_refill_cnt = 0; pdev->rx_ring.dbg_sync_success = 0; #endif +#ifdef HTT_RX_RESTORE + pdev->rx_ring.rx_reset = 0; + pdev->rx_ring.htt_rx_restore = 0; +#endif htt_rx_ring_fill_n(pdev, pdev->rx_ring.fill_level); if (pdev->cfg.is_full_reorder_offload) { diff --git a/CORE/CLD_TXRX/TXRX/ol_rx.c b/CORE/CLD_TXRX/TXRX/ol_rx.c index f7509e3eeed9..2b4248b8d272 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx.c +++ b/CORE/CLD_TXRX/TXRX/ol_rx.c @@ -97,6 +97,7 @@ void ol_rx_trigger_restore(htt_pdev_handle htt_pdev, adf_nbuf_t head_msdu, } if ( !htt_pdev->rx_ring.htt_rx_restore){ + vos_set_logp_in_progress(VOS_MODULE_ID_VOSS, TRUE); htt_pdev->rx_ring.htt_rx_restore = 1; schedule_work(&ol_rx_restore_work); } @@ -298,7 +299,7 @@ ol_rx_indication_handler( msdu_chaining = htt_rx_amsdu_pop( htt_pdev, rx_ind_msg, &head_msdu, &tail_msdu); -#ifdef HTT_RX_RESET +#ifdef HTT_RX_RESTORE if (htt_pdev->rx_ring.rx_reset) { ol_rx_trigger_restore(htt_pdev, head_msdu, tail_msdu); return; diff --git a/CORE/HDD/src/wlan_hdd_ipa.c b/CORE/HDD/src/wlan_hdd_ipa.c index fdf904944ba5..fc53fbd23e27 100644 --- a/CORE/HDD/src/wlan_hdd_ipa.c +++ b/CORE/HDD/src/wlan_hdd_ipa.c @@ -1487,6 +1487,8 @@ static void hdd_ipa_destory_rm_resource(struct hdd_ipa_priv *hdd_ipa) static void hdd_ipa_send_skb_to_network(adf_nbuf_t skb, hdd_adapter_t *adapter) { + struct hdd_ipa_priv *hdd_ipa = ghdd_ipa; + if (!adapter || adapter->magic != WLAN_HDD_ADAPTER_MAGIC) { HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, "Invalid adapter: 0x%p", adapter); @@ -1494,6 +1496,12 @@ static void hdd_ipa_send_skb_to_network(adf_nbuf_t skb, hdd_adapter_t *adapter) adf_nbuf_free(skb); return; } + + if (hdd_ipa->hdd_ctx->isUnloadInProgress) { + adf_nbuf_free(skb); + return; + } + skb->dev = adapter->dev; skb->protocol = eth_type_trans(skb, skb->dev); skb->ip_summed = CHECKSUM_NONE; @@ -1512,6 +1520,11 @@ static void hdd_ipa_send_pkt_to_ipa(struct hdd_ipa_priv *hdd_ipa) adf_nbuf_t buf; struct ipa_tx_data_desc *send_desc_head = NULL; + /* Unloading is in progress so do not proceed to send the packets to + * IPA + */ + if (hdd_ipa->hdd_ctx->isUnloadInProgress) + return; /* Make it priority queue request as send descriptor */ send_desc_head = hdd_ipa_alloc_data_desc(hdd_ipa, 1); @@ -1990,10 +2003,12 @@ static void hdd_ipa_i2w_cb(void *priv, enum ipa_dp_evt_type evt, hdd_ipa = iface_context->hdd_ipa; /* - * When SSR is going on, just drop the packets. There is no use in - * queueing the packets as STA has to connect back any way + * When SSR is going on or driver is unloading, just drop the packets. + * During SSR, there is no use in queueing the packets as STA has to + * connect back any way */ - if (hdd_ipa->hdd_ctx->isLogpInProgress) { + if (hdd_ipa->hdd_ctx->isLogpInProgress || + hdd_ipa->hdd_ctx->isUnloadInProgress) { ipa_free_skb(ipa_tx_desc); iface_context->stats.num_tx_drop++; return; @@ -2750,7 +2765,8 @@ static void hdd_ipa_rx_pipe_desc_free(void) spin_unlock_bh(&hdd_ipa->q_lock); if (i != max_desc_cnt) - HDD_IPA_LOG(VOS_TRACE_LEVEL_FATAL, "free desc leak"); + HDD_IPA_LOG(VOS_TRACE_LEVEL_FATAL, "free desc leak: %u, %u", i, + max_desc_cnt); } @@ -3120,6 +3136,13 @@ VOS_STATUS hdd_ipa_cleanup(hdd_context_t *hdd_ctx) if (!hdd_ipa_is_enabled(hdd_ctx)) return VOS_STATUS_SUCCESS; + if (!hdd_ipa_uc_is_enabled(hdd_ipa)) { + unregister_inetaddr_notifier(&hdd_ipa->ipv4_notifier); + hdd_ipa_teardown_sys_pipe(hdd_ipa); + } + + hdd_ipa_destory_rm_resource(hdd_ipa); + #ifdef WLAN_OPEN_SOURCE cancel_work_sync(&hdd_ipa->pm_work); #endif @@ -3147,10 +3170,23 @@ VOS_STATUS hdd_ipa_cleanup(hdd_context_t *hdd_ctx) hdd_ipa_debugfs_remove(hdd_ipa); + /* This should never hit but still make sure that there are no pending + * descriptor in IPA hardware + */ if (hdd_ipa->pending_hw_desc_cnt != 0) { - HDD_IPA_LOG(VOS_TRACE_LEVEL_FATAL, "IPA Pending write done: %d", + HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, + "IPA Pending write done: %d Waiting!", hdd_ipa->pending_hw_desc_cnt); - msleep(5); + + for (i = 0; hdd_ipa->pending_hw_desc_cnt != 0 && i < 10; i++) { + usleep(100); + } + + HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, + "IPA Pending write done: desc: %d %s(%d)!", + hdd_ipa->pending_hw_desc_cnt, + hdd_ipa->pending_hw_desc_cnt == 0 ? "completed" + : "leak", i); } #ifdef IPA_UC_OFFLOAD @@ -3165,14 +3201,8 @@ VOS_STATUS hdd_ipa_cleanup(hdd_context_t *hdd_ctx) #endif /* IPA_UC_OFFLOAD */ { hdd_ipa_rx_pipe_desc_free(); - hdd_ipa_teardown_sys_pipe(hdd_ipa); } - hdd_ipa_destory_rm_resource(hdd_ipa); - - if (!hdd_ipa_uc_is_enabled(hdd_ipa)) { - unregister_inetaddr_notifier(&hdd_ipa->ipv4_notifier); - } adf_os_mem_free(hdd_ipa); hdd_ctx->hdd_ipa = NULL; diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h index edf06f4b695e..64f094220626 100644 --- a/CORE/MAC/inc/qwlan_version.h +++ b/CORE/MAC/inc/qwlan_version.h @@ -44,7 +44,7 @@ BRIEF DESCRIPTION: #define QWLAN_VERSION_EXTRA "" #define QWLAN_VERSION_BUILD 184 -#define QWLAN_VERSIONSTR "1.0.0.184" +#define QWLAN_VERSIONSTR "1.0.0.184A" #define AR6320_REV1_VERSION 0x5000000 diff --git a/CORE/MAC/src/pe/lim/limAssocUtils.c b/CORE/MAC/src/pe/lim/limAssocUtils.c index fecb2adff2cd..a3e9dbe0bace 100644 --- a/CORE/MAC/src/pe/lim/limAssocUtils.c +++ b/CORE/MAC/src/pe/lim/limAssocUtils.c @@ -3294,7 +3294,8 @@ limDeleteDphHashEntry(tpAniSirGlobal pMac, tSirMacAddr staAddr, tANI_U16 staId,t //Send message to HAL about beacon parameter change. PELOGW(limLog(pMac, LOGW, FL("param bitmap = %d "), beaconParams.paramChangeBitmap);) - if(beaconParams.paramChangeBitmap) + if((VOS_FALSE == pMac->sap.SapDfsInfo.is_dfs_cac_timer_running) + && beaconParams.paramChangeBitmap) { schSetFixedBeaconFields(pMac,psessionEntry); limSendBeaconParams(pMac, &beaconParams, psessionEntry ); diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c index 97189486abb7..d25b63e56d58 100644 --- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c +++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c @@ -4750,14 +4750,17 @@ __limProcessSmeChangeBI(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf) PELOG1(limLog(pMac, LOG1, FL("LIM send update BeaconInterval Indication : %d"),pChangeBIParams->beaconInterval);); - /* Update beacon */ - schSetFixedBeaconFields(pMac, psessionEntry); - - beaconParams.bssIdx = psessionEntry->bssIdx; - //Set change in beacon Interval - beaconParams.beaconInterval = pChangeBIParams->beaconInterval; - beaconParams.paramChangeBitmap = PARAM_BCN_INTERVAL_CHANGED; - limSendBeaconParams(pMac, &beaconParams, psessionEntry); + if (VOS_FALSE == pMac->sap.SapDfsInfo.is_dfs_cac_timer_running) + { + /* Update beacon */ + schSetFixedBeaconFields(pMac, psessionEntry); + + beaconParams.bssIdx = psessionEntry->bssIdx; + //Set change in beacon Interval + beaconParams.beaconInterval = pChangeBIParams->beaconInterval; + beaconParams.paramChangeBitmap = PARAM_BCN_INTERVAL_CHANGED; + limSendBeaconParams(pMac, &beaconParams, psessionEntry); + } } return; diff --git a/CORE/MAC/src/pe/lim/limSendManagementFrames.c b/CORE/MAC/src/pe/lim/limSendManagementFrames.c index 589b04147966..b5a43b3c2e0f 100644 --- a/CORE/MAC/src/pe/lim/limSendManagementFrames.c +++ b/CORE/MAC/src/pe/lim/limSendManagementFrames.c @@ -1497,7 +1497,8 @@ limSendAssocRspMgmtFrame(tpAniSirGlobal pMac, beaconParams.bssIdx = psessionEntry->bssIdx; //Send message to HAL about beacon parameter change. - if(beaconParams.paramChangeBitmap) + if((VOS_FALSE == pMac->sap.SapDfsInfo.is_dfs_cac_timer_running) + && beaconParams.paramChangeBitmap) { schSetFixedBeaconFields(pMac,psessionEntry); limSendBeaconParams(pMac, &beaconParams, psessionEntry ); diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c index 850b111c8074..6a7e26fd2677 100644 --- a/CORE/MAC/src/pe/lim/limUtils.c +++ b/CORE/MAC/src/pe/lim/limUtils.c @@ -1775,7 +1775,8 @@ void limHandleUpdateOlbcCache(tpAniSirGlobal pMac) enable = 0; } - if(beaconParams.paramChangeBitmap) + if ((VOS_FALSE == pMac->sap.SapDfsInfo.is_dfs_cac_timer_running) + && beaconParams.paramChangeBitmap) { schSetFixedBeaconFields(pMac,psessionEntry); limSendBeaconParams(pMac, &beaconParams, psessionEntry); diff --git a/CORE/MAC/src/pe/sch/schBeaconProcess.c b/CORE/MAC/src/pe/sch/schBeaconProcess.c index d1b03b881d89..52d26d36d8c1 100644 --- a/CORE/MAC/src/pe/sch/schBeaconProcess.c +++ b/CORE/MAC/src/pe/sch/schBeaconProcess.c @@ -651,7 +651,8 @@ static void __schBeaconProcessForSession( tpAniSirGlobal pMac, psessionEntry->bssId, psessionEntry->currentOperChannel,psessionEntry->selfMacAddr, psessionEntry->dot11mode, 0, NULL); - if(beaconParams.paramChangeBitmap) + if ((VOS_FALSE == pMac->sap.SapDfsInfo.is_dfs_cac_timer_running) + && beaconParams.paramChangeBitmap) { PELOGW(schLog(pMac, LOGW, FL("Beacon for session[%d] got changed. "), psessionEntry->peSessionId);) PELOGW(schLog(pMac, LOGW, FL("sending beacon param change bitmap: 0x%x "), beaconParams.paramChangeBitmap);) @@ -741,7 +742,8 @@ void schBeaconProcess(tpAniSirGlobal pMac, tANI_U8* pRxPacketInfo, tpPESession p ap_beacon_process(pMac, pRxPacketInfo, &beaconStruct, &beaconParams, pAPSession); - if (beaconParams.paramChangeBitmap) + if ((VOS_FALSE == pMac->sap.SapDfsInfo.is_dfs_cac_timer_running) + && beaconParams.paramChangeBitmap) { //Update the beacons and apply the new settings to HAL schSetFixedBeaconFields(pMac, pAPSession); diff --git a/CORE/SAP/inc/sapApi.h b/CORE/SAP/inc/sapApi.h index 86c6ae0b637b..204bca409ede 100644 --- a/CORE/SAP/inc/sapApi.h +++ b/CORE/SAP/inc/sapApi.h @@ -562,6 +562,14 @@ typedef struct sSapDfsInfo v_U8_t numCurrentRegDomainDfsChannels; tSapDfsNolInfo sapDfsChannelNolList[NUM_5GHZ_CHANNELS]; v_U8_t is_dfs_cac_timer_running; + /* + * New channel width and new channel bonding mode + * will only be updated via channel fallback mechanism + */ + tANI_U8 orig_cbMode; + tANI_U8 orig_chanWidth; + tANI_U8 new_chanWidth; + tANI_U8 new_cbMode; } tSapDfsInfo; typedef struct tagSapCtxList diff --git a/CORE/SAP/src/sapChSelect.h b/CORE/SAP/src/sapChSelect.h index 71510a022bd3..f75b873e63cf 100644 --- a/CORE/SAP/src/sapChSelect.h +++ b/CORE/SAP/src/sapChSelect.h @@ -113,10 +113,39 @@ typedef enum CHANNEL_14 } tSapChannel; +#define MAX_80MHZ_BANDS 5 +#define SAP_80MHZ_MASK 0x0F +#define SAP_40MHZ_MASK_L 0x03 +#define SAP_40MHZ_MASK_H 0x0C + +/* + * structs for holding channel bonding bitmap + * used for finding new channel when SAP is on + * DFS channel and radar is detected. + */ +typedef struct sChannelBondingInfo { + v_U8_t channelMap:4; + v_U8_t rsvd:4; + v_U8_t startChannel; +} tChannelBondingInfo; + +typedef struct __chan_bonding_bitmap { + tChannelBondingInfo chanBondingSet[MAX_80MHZ_BANDS]; +} chan_bonding_bitmap; + /** * Structure holding information of each channel in the spectrum, * it contains the channel number, the computed weight */ +typedef struct sChannelInfo { + v_U8_t channel; + v_BOOL_t valid; // if the channel is valid to be picked as new channel +} tChannelInfo; + +typedef struct sAll5GChannelList{ + v_U8_t numChannel; + tChannelInfo *channelList; +} tAll5GChannelList; typedef struct sSapChannelListInfo{ v_U8_t numChannel; diff --git a/CORE/SAP/src/sapFsm.c b/CORE/SAP/src/sapFsm.c index de4a87fc6254..8ef407ef3d74 100644 --- a/CORE/SAP/src/sapFsm.c +++ b/CORE/SAP/src/sapFsm.c @@ -273,170 +273,170 @@ tSapChanMatrixInfo ht80_chan[] = tSapChanMatrixInfo ht40_chan[] = { {52, - {{36, 328}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 230}, {48, SAP_TX_LEAKAGE_MIN }, + {{36, 328}, {40, 328 }, + {44, 230}, {48, 230 }, {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN}, - {60, 323}, {64, SAP_TX_LEAKAGE_MIN }, - {100, 625}, {104, SAP_TX_LEAKAGE_MIN }, - {108, 646},{112, SAP_TX_LEAKAGE_MIN }, + {60, 323}, {64, 323 }, + {100, 625}, {104, 323 }, + {108, 646},{112, 646 }, {116, SAP_TX_LEAKAGE_MAX},{120, SAP_TX_LEAKAGE_MAX}, {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX}, {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX}, {140, SAP_TX_LEAKAGE_MAX}}}, {56, - {{36, 446}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 300}, {48, SAP_TX_LEAKAGE_MIN }, + {{36, 446}, {40, 446 }, + {44, 300}, {48, 300 }, {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN}, {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN}, - {100, 611},{104, SAP_TX_LEAKAGE_MIN }, - {108, 617},{112, SAP_TX_LEAKAGE_MIN }, + {100, 611},{104, 611 }, + {108, 617},{112, 617 }, {116, SAP_TX_LEAKAGE_MAX},{120, SAP_TX_LEAKAGE_MAX}, {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX}, {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX}, {140, SAP_TX_LEAKAGE_MAX}}}, {60, - {{36, 481}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 407}, {48, SAP_TX_LEAKAGE_MIN }, - {52, 190}, {56, SAP_TX_LEAKAGE_MIN}, + {{36, 481}, {40, 481 }, + {44, 407}, {48, 407 }, + {52, 190}, {56, 190}, {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN}, - {100, 608},{104, SAP_TX_LEAKAGE_MIN }, - {108, 623},{112, SAP_TX_LEAKAGE_MIN }, + {100, 608},{104, 608 }, + {108, 623},{112, 623 }, {116, SAP_TX_LEAKAGE_MAX},{120, SAP_TX_LEAKAGE_MAX}, {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX}, {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX}, {140, SAP_TX_LEAKAGE_MAX}}}, {64, - {{36, 524}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 527}, {48, SAP_TX_LEAKAGE_MIN }, - {52, 295}, {56, SAP_TX_LEAKAGE_MIN }, + {{36, 524}, {40, 524 }, + {44, 527}, {48, 527 }, + {52, 295}, {56, 295 }, {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN}, - {100, 594}, {104, SAP_TX_LEAKAGE_MIN }, - {108, 625},{112, SAP_TX_LEAKAGE_MIN }, + {100, 594}, {104, 594 }, + {108, 625},{112, 625 }, {116, SAP_TX_LEAKAGE_MAX},{120, SAP_TX_LEAKAGE_MAX}, {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX}, {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX}, {140, SAP_TX_LEAKAGE_MAX}}}, {100, - {{36, 618}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 604}, {48, SAP_TX_LEAKAGE_MIN }, - {52, 596}, {56, SAP_TX_LEAKAGE_MIN }, - {60, 584}, {64, SAP_TX_LEAKAGE_MIN }, + {{36, 618}, {40, 618 }, + {44, 604}, {48, 604 }, + {52, 596}, {56, 596 }, + {60, 584}, {64, 584 }, {100, SAP_TX_LEAKAGE_MIN},{104, SAP_TX_LEAKAGE_MIN }, - {108, 299}, {112, SAP_TX_LEAKAGE_MIN }, - {116, 486}, {120, SAP_TX_LEAKAGE_MIN }, - {124, 498}, {128, SAP_TX_LEAKAGE_MIN }, - {132, 538}, {136, SAP_TX_LEAKAGE_MIN }, + {108, 299}, {112, 299 }, + {116, 486}, {120, 486 }, + {124, 498}, {128, 498 }, + {132, 538}, {136, 538 }, {140, 598}}}, {104, - {{36, 636}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 601}, {48, SAP_TX_LEAKAGE_MIN }, - {52, 616}, {56, SAP_TX_LEAKAGE_MIN }, - {60, 584}, {64, SAP_TX_LEAKAGE_MIN }, + {{36, 636}, {40, 636 }, + {44, 601}, {48, 601 }, + {52, 616}, {56, 616 }, + {60, 584}, {64, 584 }, {100, SAP_TX_LEAKAGE_MIN},{104, SAP_TX_LEAKAGE_MIN}, {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN}, - {116, 396},{120, SAP_TX_LEAKAGE_MIN }, - {124, 483}, {128, SAP_TX_LEAKAGE_MIN }, - {132, 553}, {136, SAP_TX_LEAKAGE_MIN }, + {116, 396},{120, 396 }, + {124, 483}, {128, 483 }, + {132, 553}, {136, 553 }, {140, 568}}}, {108, - {{36, 600}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 627}, {48, SAP_TX_LEAKAGE_MIN }, - {52, 611}, {56, SAP_TX_LEAKAGE_MIN }, - {60, 611}, {64, SAP_TX_LEAKAGE_MIN }, - {100, 214},{104, SAP_TX_LEAKAGE_MIN}, + {{36, 600}, {40, 600 }, + {44, 627}, {48, 627 }, + {52, 611}, {56, 611 }, + {60, 611}, {64, 611 }, + {100, 214},{104, 214}, {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN}, - {116, 323},{120, SAP_TX_LEAKAGE_MIN}, - {124, 494},{128, SAP_TX_LEAKAGE_MIN}, - {132, 566},{136, SAP_TX_LEAKAGE_MIN }, + {116, 323},{120, 323}, + {124, 494},{128, 494}, + {132, 566},{136, 566 }, {140, 534}}}, {112, - {{36, 645}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 641}, {48, SAP_TX_LEAKAGE_MIN }, - {52, 618}, {56, SAP_TX_LEAKAGE_MIN }, - {60, 612}, {64, SAP_TX_LEAKAGE_MIN }, - {100, 293},{104, SAP_TX_LEAKAGE_MIN}, + {{36, 645}, {40, 645 }, + {44, 641}, {48, 641 }, + {52, 618}, {56, 618 }, + {60, 612}, {64, 612 }, + {100, 293},{104, 293}, {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN}, {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN}, - {124, 414},{128, SAP_TX_LEAKAGE_MIN}, - {132, 533},{136, SAP_TX_LEAKAGE_MIN }, + {124, 414},{128, 414}, + {132, 533},{136, 533 }, {140, 521}}}, {116, - {{36, 661}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 624}, {48, SAP_TX_LEAKAGE_MIN }, - {52, 634}, {56, SAP_TX_LEAKAGE_MIN }, - {60, 611}, {64, SAP_TX_LEAKAGE_MIN }, - {100, 371},{104, SAP_TX_LEAKAGE_MIN}, - {108, 217},{112, SAP_TX_LEAKAGE_MIN }, + {{36, 661}, {40, 661 }, + {44, 624}, {48, 624 }, + {52, 634}, {56, 634 }, + {60, 611}, {64, 611 }, + {100, 371},{104, 371}, + {108, 217},{112, 217 }, {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN}, - {124, 309},{128, SAP_TX_LEAKAGE_MIN }, - {132, 412},{136, SAP_TX_LEAKAGE_MIN}, + {124, 309},{128, 309 }, + {132, 412},{136, 412}, {140, 509}}}, {120, - {{36, 667}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 645}, {48, SAP_TX_LEAKAGE_MIN }, - {52, 633}, {56, SAP_TX_LEAKAGE_MIN }, - {60, 619}, {64, SAP_TX_LEAKAGE_MIN }, - {100, 467}, {104, SAP_TX_LEAKAGE_MIN}, - {108, 291},{112, SAP_TX_LEAKAGE_MIN}, + {{36, 667}, {40, 667 }, + {44, 645}, {48, 645 }, + {52, 633}, {56, 633 }, + {60, 619}, {64, 619 }, + {100, 467}, {104, 467}, + {108, 291},{112, 291}, {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN}, {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN}, - {132, 434},{136, SAP_TX_LEAKAGE_MIN}, + {132, 434},{136, 434}, {140, 514}}}, {124, - {{36, 676}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 668}, {48, SAP_TX_LEAKAGE_MIN }, - {52, 595}, {56, SAP_TX_LEAKAGE_MIN }, - {60, 622}, {64, SAP_TX_LEAKAGE_MIN }, - {100, 494}, {104, SAP_TX_LEAKAGE_MIN}, - {108, 393},{112, SAP_TX_LEAKAGE_MIN}, - {116, 225},{120, SAP_TX_LEAKAGE_MIN}, + {{36, 676}, {40, 676 }, + {44, 668}, {48, 668 }, + {52, 595}, {56, 595 }, + {60, 622}, {64, 622 }, + {100, 494}, {104, 494}, + {108, 393},{112, 393}, + {116, 225},{120, 225}, {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN}, - {132, 327},{136, SAP_TX_LEAKAGE_MIN}, + {132, 327},{136, 327}, {140, 468}}}, {128, - {{36, 678}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 664}, {48, SAP_TX_LEAKAGE_MIN }, - {52, 651}, {56, SAP_TX_LEAKAGE_MIN }, - {60, 643}, {64, SAP_TX_LEAKAGE_MIN }, - {100, 502}, {104, SAP_TX_LEAKAGE_MIN }, - {108, 503},{112, SAP_TX_LEAKAGE_MIN}, - {116, 293},{120, SAP_TX_LEAKAGE_MIN}, + {{36, 678}, {40, 678 }, + {44, 664}, {48, 664 }, + {52, 651}, {56, 651 }, + {60, 643}, {64, 643 }, + {100, 502}, {104, 502 }, + {108, 503},{112, 503}, + {116, 293},{120, 293}, {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN}, {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN}, {140, 415}}}, {132, - {{36, 689}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 669}, {48, SAP_TX_LEAKAGE_MIN }, - {52, 662}, {56, SAP_TX_LEAKAGE_MIN }, - {60, 609}, {64, SAP_TX_LEAKAGE_MIN }, - {100, 538},{104, SAP_TX_LEAKAGE_MIN }, - {108, 534}, {112, SAP_TX_LEAKAGE_MIN }, - {116, 428},{120, SAP_TX_LEAKAGE_MIN}, - {124, 247},{128, SAP_TX_LEAKAGE_MIN}, + {{36, 689}, {40, 689 }, + {44, 669}, {48, 669 }, + {52, 662}, {56, 662 }, + {60, 609}, {64, 609 }, + {100, 538},{104, 538 }, + {108, 534}, {112, 534 }, + {116, 428},{120, 428}, + {124, 247},{128, 247}, {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN}, {140, SAP_TX_LEAKAGE_MIN }}}, {136, - {{36, 703}, {40, SAP_TX_LEAKAGE_MIN }, + {{36, 703}, {40, 703 }, {44, 688}, {48, SAP_TX_LEAKAGE_MIN }, - {52, 671}, {56, SAP_TX_LEAKAGE_MIN }, - {60, 658}, {64, SAP_TX_LEAKAGE_MIN }, - {100, 504},{104, SAP_TX_LEAKAGE_MIN }, - {108, 513},{112, SAP_TX_LEAKAGE_MIN }, - {116, 428}, {120, SAP_TX_LEAKAGE_MIN}, - {124, 289},{128, SAP_TX_LEAKAGE_MIN}, + {52, 671}, {56, 671 }, + {60, 658}, {64, 658 }, + {100, 504},{104, 504 }, + {108, 513},{112, 513 }, + {116, 428}, {120, 428}, + {124, 289},{128, 289}, {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN}, {140, SAP_TX_LEAKAGE_MIN }}}, {140, - {{36, 695}, {40, SAP_TX_LEAKAGE_MIN }, - {44, 684}, {48, SAP_TX_LEAKAGE_MIN }, - {52, 664}, {56, SAP_TX_LEAKAGE_MIN }, - {60, 658}, {64, SAP_TX_LEAKAGE_MIN }, - {100, 601},{104, SAP_TX_LEAKAGE_MIN }, - {108, 545},{112, SAP_TX_LEAKAGE_MIN }, - {116, 529}, {120, SAP_TX_LEAKAGE_MIN}, - {124, 432},{128, SAP_TX_LEAKAGE_MIN}, - {132, 262},{136, SAP_TX_LEAKAGE_MIN}, + {{36, 695}, {40, 695 }, + {44, 684}, {48, 684 }, + {52, 664}, {56, 664 }, + {60, 658}, {64, 658 }, + {100, 601},{104, 601 }, + {108, 545},{112, 545 }, + {116, 529}, {120, 529}, + {124, 432},{128, 432}, + {132, 262},{136, 262}, {140, SAP_TX_LEAKAGE_MIN }}}, }; @@ -506,8 +506,8 @@ tSapChanMatrixInfo ht20_chan[] = {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX}, {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX}, {100, SAP_TX_LEAKAGE_MIN},{104, SAP_TX_LEAKAGE_MIN}, - {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN}, - {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN}, + {108, SAP_TX_LEAKAGE_MIN},{112, 463}, + {116, 483},{120, 503}, {124, 523}, {128, 565}, {132, 570}, {136, 588}, {140, 585}}}, @@ -516,67 +516,67 @@ tSapChanMatrixInfo ht20_chan[] = {44, 611}, {48, 614}, {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX}, {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX}, - {100, SAP_TX_LEAKAGE_MIN},{104, SAP_TX_LEAKAGE_MIN}, + {100, 477},{104, SAP_TX_LEAKAGE_MIN}, {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN}, - {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN}, - {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN}, - {132, SAP_TX_LEAKAGE_MIN},{136, 577}, + {116, 477},{120, 497}, + {124, 517},{128, 537}, + {132, 557},{136, 577}, {140, 603}}}, {112, {{36, 636}, {40, 623}, {44, 638}, {48, 628}, {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX}, {60, SAP_TX_LEAKAGE_MAX}, {64, 606}, - {100, SAP_TX_LEAKAGE_MIN},{104, SAP_TX_LEAKAGE_MIN}, + {100, 501},{104, 481}, {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN}, - {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN}, - {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN}, - {132, SAP_TX_LEAKAGE_MIN},{136, 561}, + {116, SAP_TX_LEAKAGE_MIN},{120, 481}, + {124, 501},{128, 421}, + {132, 541},{136, 561}, {140, 583}}}, {116, {{36, 646}, {40, 648}, {44, 633}, {48, 634}, {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX}, - {60, 615}, {64, SAP_TX_LEAKAGE_MAX}, - {100, SAP_TX_LEAKAGE_MIN},{104, SAP_TX_LEAKAGE_MIN}, - {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN}, + {60, 615}, {64, 594}, + {100, 575},{104, 554}, + {108, 534},{112, SAP_TX_LEAKAGE_MIN}, {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN}, {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN}, - {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN}, + {132, 534},{136, 554}, {140, 574}}}, {120, {{36, 643}, {40, 649}, {44, 654}, {48, 629}, {52, SAP_TX_LEAKAGE_MAX}, {56, 621}, {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX}, - {100, 565}, {104, SAP_TX_LEAKAGE_MIN}, - {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN}, + {100, 565}, {104, 545}, + {108, 525},{112, 505}, {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN}, - {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN}, - {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN}, - {140, SAP_TX_LEAKAGE_MIN}}}, + {124, SAP_TX_LEAKAGE_MIN},{128, 505}, + {132, 525},{136, 545}, + {140, 565}}}, {124, {{36, 638}, {40, 657}, {44, 663}, {48, 649}, {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX}, {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX}, - {100, 581}, {104, SAP_TX_LEAKAGE_MIN}, - {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN}, - {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN}, + {100, 581}, {104, 561}, + {108, 541},{112, 521}, + {116, 499},{120, SAP_TX_LEAKAGE_MIN}, {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN}, - {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN}, - {140, SAP_TX_LEAKAGE_MIN}}}, + {132, 499},{136, 519}, + {140, 539}}}, {128, {{36, 651}, {40, 651}, {44, 674}, {48, 640}, {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX}, {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX}, {100, 603}, {104, 560}, - {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN}, - {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN}, + {108, 540},{112, 520}, + {116, 499},{120, 479}, {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN}, - {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN}, - {140, SAP_TX_LEAKAGE_MIN}}}, + {132, SAP_TX_LEAKAGE_MIN},{136, 479}, + {140, 499}}}, {132, {{36, 643}, {40, 668}, {44, 651}, {48, 657}, @@ -584,10 +584,10 @@ tSapChanMatrixInfo ht20_chan[] = {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX}, {100, SAP_TX_LEAKAGE_MAX},{104, 602}, {108, 578}, {112, 570}, - {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN}, - {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN}, + {116, 550},{120, 530}, + {124, 510},{128, SAP_TX_LEAKAGE_MIN}, {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN}, - {140, SAP_TX_LEAKAGE_MIN}}}, + {140, 490}}}, {136, {{36, 654}, {40, 667}, {44, 666}, {48, 642}, @@ -595,20 +595,20 @@ tSapChanMatrixInfo ht20_chan[] = {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX}, {100, SAP_TX_LEAKAGE_MAX},{104, SAP_TX_LEAKAGE_MAX}, {108, SAP_TX_LEAKAGE_MAX},{112, 596}, - {116, 555}, {120, SAP_TX_LEAKAGE_MIN}, - {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN}, + {116, 555}, {120, 535}, + {124, 515},{128, 495}, {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN}, - {140, SAP_TX_LEAKAGE_MAX}}}, + {140, SAP_TX_LEAKAGE_MIN}}}, {140, {{36, 679}, {40, 673}, {44, 667}, {48, 656}, {52, 634}, {56, 663}, - {60, 662}, {64, SAP_TX_LEAKAGE_MAX}, + {60, 662}, {64, 660}, {100, SAP_TX_LEAKAGE_MAX},{104, SAP_TX_LEAKAGE_MAX}, {108, SAP_TX_LEAKAGE_MAX},{112, 590}, - {116, 573}, {120, SAP_TX_LEAKAGE_MIN}, - {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN}, - {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN}, + {116, 573}, {120, 553}, + {124, 533},{128, 513}, + {132, 490},{136, SAP_TX_LEAKAGE_MIN}, {140, SAP_TX_LEAKAGE_MIN}}}, }; @@ -728,17 +728,18 @@ static inline void sapEventInit(ptWLAN_SAPEvent sapEvent) * RETURN VALUE * BOOLEAN to indicate if the target channel is good or bad to switch * - * TRUE: the channel is above the tx leak threshold - * FALSE: good to be used + * TRUE: the channel is above the tx leak threshold, CANNOT USE + * FALSE: the channel is below the tx leak threshold, CAN BE USED */ v_BOOL_t -sapChannelMatrixCheck(ptSapContext sapContext, v_U8_t target_channel) +sapChannelMatrixCheck(ptSapContext sapContext, + ePhyChanBondState cbMode, + v_U8_t target_channel) { tSapTxLeakInfo *target_chan_matrix = NULL; tSapChanMatrixInfo *pchan_matrix = NULL; v_U32_t num_channel = (RF_CHAN_140 - RF_CHAN_36) + 1; v_U32_t nchan_matrix; - ePhyChanBondState cbMode; tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx); int i = 0; @@ -747,9 +748,6 @@ sapChannelMatrixCheck(ptSapContext sapContext, v_U8_t target_channel) return VOS_FALSE; } - cbMode = sme_GetCBPhyStateFromCBIniValue( - sme_GetChannelBondingMode5G(hHal)); - switch (cbMode) { case PHY_SINGLE_CHANNEL_CENTERED: /* HT20 */ @@ -831,111 +829,319 @@ sapChannelMatrixCheck(ptSapContext sapContext, v_U8_t target_channel) return VOS_FALSE; } +/* + * This function adds availabe channel to bitmap + * + * PARAMETERS + * IN + * pBitmap: bitmap to populate + * channel: channel to set in bitmap + */ +static void sapSetBitmap(chan_bonding_bitmap *pBitmap, v_U8_t channel) +{ + int i = 0; + int start_channel = 0; + for ( i = 0; i < MAX_80MHZ_BANDS; i++ ) { + start_channel = pBitmap->chanBondingSet[i].startChannel; + if (channel >= start_channel && channel <= start_channel + 12) { + pBitmap->chanBondingSet[i].channelMap |= + 1 << ((channel - start_channel)/4); + return; + } + } + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + FL("Channel=%d is not in the bitmap"), channel); +} + +/* + * This function reads the bitmap and populates available channel + * list according to channel bonding mode. This will be called for + * 80 MHz and 40 Mhz only. For 20 MHz no need for bitmap hence list + * is directly created while parsing the main list + * + * PARAMETERS + * IN + * pBitmap: bitmap to populate + * cbModeCurrent: cb mode to check for channel availability + * availableChannels: available channel list to populate + * + * RETURN VALUE + * number of channels found + */ +static v_U8_t sapPopulateAvailableChannels(chan_bonding_bitmap *pBitmap, + ePhyChanBondState cbModeCurrent, + v_U8_t *availableChannels) +{ + v_U8_t i = 0; + v_U8_t channelCount = 0; + v_U8_t start_channel = 0; + + switch (cbModeCurrent) { +#ifdef WLAN_FEATURE_11AC + /* HT80 */ + case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW: + case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW: + case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH: + case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH: + for ( i = 0; i < MAX_80MHZ_BANDS; i++ ) { + start_channel = pBitmap->chanBondingSet[i].startChannel; + if (pBitmap->chanBondingSet[i].channelMap == SAP_80MHZ_MASK) { + availableChannels[channelCount++] = start_channel; + availableChannels[channelCount++] = start_channel + 4; + availableChannels[channelCount++] = start_channel + 8; + availableChannels[channelCount++] = start_channel + 12; + } + } + break; +#endif + /* HT40 */ + case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY: + case PHY_DOUBLE_CHANNEL_LOW_PRIMARY: + for ( i = 0; i < MAX_80MHZ_BANDS; i++ ) { + start_channel = pBitmap->chanBondingSet[i].startChannel; + if ((pBitmap->chanBondingSet[i].channelMap & SAP_40MHZ_MASK_L) + == SAP_40MHZ_MASK_L) { + availableChannels[channelCount++] = start_channel; + availableChannels[channelCount++] = start_channel + 4; + } else { + if ((pBitmap->chanBondingSet[i].channelMap & + SAP_40MHZ_MASK_H) == SAP_40MHZ_MASK_H) { + availableChannels[channelCount++] = start_channel + 8; + availableChannels[channelCount++] = start_channel + 12; + } + } + } + break; + default: + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + FL("Invalid case.")); + break; + } + + return channelCount; +} /* * This function randomly pick up an AVAILABLE channel */ static v_U8_t sapRandomChannelSel(ptSapContext sapContext) { - v_U8_t available_chan_idx[WNI_CFG_VALID_CHANNEL_LIST_LEN]; - int available_chan_count; - v_U32_t random_byte = 0; - v_U8_t target_channel = 0; - v_U8_t total_num_channels = 0; + v_U32_t random_byte = 0; + v_U8_t available_chnl_count = 0; + v_U8_t availableChannels[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0,}; + v_U8_t target_channel = 0; v_BOOL_t isChannelNol = VOS_FALSE; v_BOOL_t isOutOfRange = VOS_FALSE; - int i=0; + chan_bonding_bitmap channelBitmap; + v_U8_t i = 0; + v_U8_t channelID; + tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx); + tpAniSirGlobal pMac; + tANI_U32 chanWidth; + ePhyChanBondState cbModeCurrent; + + if (NULL == hHal) { + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + FL("invalid hHal")); + return target_channel; + } + + pMac = PMAC_STRUCT(hHal); + if (NULL == pMac) { + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + FL("invalid pMac")); + return target_channel; + } + + /* + * Retrieve the original one and store it. + * use the stored original value when you call this function next time + * so fall back mechanism always starts with original ini value. + */ + if (pMac->sap.SapDfsInfo.orig_cbMode == 0) + { + pMac->sap.SapDfsInfo.orig_cbMode = + pMac->roam.configParam.channelBondingMode5GHz; + cbModeCurrent = pMac->sap.SapDfsInfo.orig_cbMode; + } + else + { + cbModeCurrent = pMac->sap.SapDfsInfo.orig_cbMode; + } + + /* + * Retrieve the original one and store it. + * use the stored original value when you call this function next time + * so fall back mechanism always starts with original ini value. + */ + if (pMac->sap.SapDfsInfo.orig_chanWidth == 0) + { + pMac->sap.SapDfsInfo.orig_chanWidth = + pMac->roam.configParam.nVhtChannelWidth; + chanWidth = pMac->sap.SapDfsInfo.orig_chanWidth; + } + else + { + chanWidth = pMac->sap.SapDfsInfo.orig_chanWidth; + } if (sapGet5GHzChannelList(sapContext)) { VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW, - "%s: get 5Ghz channel list failed", - __func__); - return sapContext->channel; + FL("Get 5Ghz channel list failed")); + return target_channel; } - total_num_channels = sapContext->SapAllChnlList.numChannel; - for (i = 0, available_chan_count = 0; i < total_num_channels; i++) + + /* loop to check ACS range or NOL channels */ + for (i = 0; i < sapContext->SapAllChnlList.numChannel; i++) { - /* - * Now Check if the channel is DFS and if - * the channel is not in NOL and add - * it available_chan_idx otherwise skip this - * channel index. - */ + channelID = sapContext->SapAllChnlList.channelList[i].channel; - if (vos_nv_getChannelEnabledState(sapContext->SapAllChnlList - .channelList[i]) == - NV_CHANNEL_DFS) + if (vos_nv_getChannelEnabledState(channelID) == NV_CHANNEL_DFS) { isChannelNol = sapDfsIsChannelInNolList(sapContext, - sapContext->SapAllChnlList.channelList[i], - PHY_SINGLE_CHANNEL_CENTERED); + channelID, + PHY_SINGLE_CHANNEL_CENTERED); if (VOS_TRUE == isChannelNol) { /* - * Skip this channel since it is still in + * Mark this channel invalid since it is still in * DFS Non-Occupancy-Period which is 30 mins. */ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW, - "%s[%d]: index: %d, Channel = %d Present in NOL LIST", - __func__, __LINE__, i, - sapContext->SapAllChnlList.channelList[i]); - - continue; + FL("index: %d, Channel = %d Present in NOL LIST"), + i, channelID); + sapContext->SapAllChnlList.channelList[i].valid = VOS_FALSE; } } /* check if the channel is within ACS channel range */ isOutOfRange = sapAcsChannelCheck(sapContext, - sapContext->SapAllChnlList.channelList[i]); + channelID); if (VOS_TRUE == isOutOfRange) { /* - * Skip this channel since it is out of ACS channel range + * mark this channel invalid since it is out of ACS channel range */ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW, - "%s[%d]: index: %d, Channel = %d out of ACS channel range", - __func__, __LINE__, i, - sapContext->SapAllChnlList.channelList[i]); - - continue; + FL("index: %d, Channel = %d out of ACS channel range"), + i, channelID); + sapContext->SapAllChnlList.channelList[i].valid = VOS_FALSE; } - - /* check the channel matrix */ - if (VOS_TRUE == sapChannelMatrixCheck(sapContext, - sapContext->SapAllChnlList.channelList[i])) - { - /* skip this channel, it is out of tx leak threshold */ - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW, - FL("Channel=%d has tx leakage"), - sapContext->SapAllChnlList.channelList[i]); - continue; + } /* end of check for NOL or ACS channels */ + + do + { + vos_mem_zero(&channelBitmap, sizeof(channelBitmap)); + channelBitmap.chanBondingSet[0].startChannel = 36; + channelBitmap.chanBondingSet[1].startChannel = 52; + channelBitmap.chanBondingSet[2].startChannel = 100; + channelBitmap.chanBondingSet[3].startChannel = 116; + channelBitmap.chanBondingSet[4].startChannel = 149; + vos_mem_zero(availableChannels, sizeof(availableChannels)); + /* now loop through whatever is left of channel list */ + for (i = 0; i < sapContext->SapAllChnlList.numChannel; i++ ){ + /* check the channel matrix */ + if (sapContext->SapAllChnlList.channelList[i].valid) { + channelID = sapContext->SapAllChnlList.channelList[i].channel; + /* if leakage for this channel is within limits */ + if (VOS_FALSE == sapChannelMatrixCheck(sapContext, + cbModeCurrent, + channelID)) { + /* for 20MHz, directly create available channel list */ + if (cbModeCurrent == PHY_SINGLE_CHANNEL_CENTERED) { + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_INFO_LOW, + FL("Channel=%d added to available list"), + channelID); + availableChannels[available_chnl_count++] = channelID; + } else { + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_INFO_LOW, + FL("Channel=%d added to bitmap"), + channelID); + sapSetBitmap(&channelBitmap, channelID); + } + } + } + } /* end of loop to check against DFS leakage channel matrix */ + + /* if 40 MHz or 80 MHz, populate available channel list from bitmap */ + if (cbModeCurrent != PHY_SINGLE_CHANNEL_CENTERED) { + available_chnl_count = sapPopulateAvailableChannels(&channelBitmap, + cbModeCurrent, + availableChannels); + /* if no valid channel bonding found, fallback to lower bandwidth */ + if (available_chnl_count == 0) { + if (cbModeCurrent >= + PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED) { + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_WARN, + FL("sapdfs:No 80MHz cb found, falling to 40MHz")); + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_WARN, + FL("sapdfs:Changing chanWidth from [%d] to [%d]"), + chanWidth, eHT_CHANNEL_WIDTH_40MHZ); + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_WARN, + FL("sapdfs:Changing CB mode from [%d] to [%d]"), + cbModeCurrent, PHY_DOUBLE_CHANNEL_LOW_PRIMARY); + cbModeCurrent = PHY_DOUBLE_CHANNEL_LOW_PRIMARY; + chanWidth = eHT_CHANNEL_WIDTH_40MHZ; + /* continue to start of do loop */ + continue; + } else if (cbModeCurrent >= + PHY_DOUBLE_CHANNEL_LOW_PRIMARY ) { + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_WARN, + FL("sapdfs:No 40MHz cb found, falling to 20MHz")); + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_WARN, + FL("sapdfs:Changing chanWidth from [%d] to [%d]"), + chanWidth, eHT_CHANNEL_WIDTH_20MHZ); + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_WARN, + FL("sapdfs:Changing CB mode from [%d] to [%d]"), + cbModeCurrent, PHY_SINGLE_CHANNEL_CENTERED); + cbModeCurrent = PHY_SINGLE_CHANNEL_CENTERED; + chanWidth = eHT_CHANNEL_WIDTH_20MHZ; + /* continue to start of do loop */ + continue; + } + } } - available_chan_idx[available_chan_count++] = - sapContext->SapAllChnlList.channelList[i]; - } - - if (available_chan_count) - { - /* to generate a random index */ - get_random_bytes(&random_byte,1); - i = (random_byte + jiffies) % available_chan_count; - /* - * Pick the channel from the random index - * in available_chan_idx list + * by now, available channels list will be populated or + * no channels are avaialbe */ - target_channel = (available_chan_idx[i]); - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW, - "%s[%d]: Target channel Index = %d target_channel = %d", - __func__,__LINE__, i, target_channel); - } else { - sapSignalHDDevent(sapContext, NULL, eSAP_DFS_NO_AVAILABLE_CHANNEL, - (v_PVOID_t) eSAP_STATUS_SUCCESS); - target_channel = 0; - } + if (available_chnl_count) { + get_random_bytes(&random_byte, 1); + i = (random_byte + jiffies) % available_chnl_count; + /* Random channel selection from available list */ + target_channel = availableChannels[i]; + pMac->sap.SapDfsInfo.new_chanWidth = chanWidth; + pMac->sap.SapDfsInfo.new_cbMode = cbModeCurrent; + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_INFO_LOW, + FL("sapdfs: New CB mode = %d"), + pMac->sap.SapDfsInfo.new_cbMode); + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_INFO_LOW, + FL("sapdfs: New Channel width = %d"), + pMac->sap.SapDfsInfo.new_chanWidth); + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_INFO_LOW, + FL("sapdfs: target_channel = %d"), target_channel); + } + else { + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_INFO_LOW, + FL("No target channel found")); + } + break; + } while(1); /* this loop will iterate at max 3 times */ return target_channel; } @@ -2509,6 +2715,9 @@ sapFsm /* No available channel found */ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, FL("No available channel found!!!")); + sapSignalHDDevent(sapContext, NULL, + eSAP_DFS_NO_AVAILABLE_CHANNEL, + (v_PVOID_t) eSAP_STATUS_SUCCESS); return VOS_STATUS_E_FAULT; } @@ -3529,7 +3738,8 @@ static VOS_STATUS sapGet5GHzChannelList(ptSapContext sapContext) } sapContext->SapAllChnlList.channelList = - (v_U8_t *)vos_mem_malloc(WNI_CFG_VALID_CHANNEL_LIST_LEN); + (tChannelInfo *)vos_mem_malloc(WNI_CFG_VALID_CHANNEL_LIST_LEN * + sizeof(tChannelInfo)); if (NULL == sapContext->SapAllChnlList.channelList) { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, @@ -3542,11 +3752,12 @@ static VOS_STATUS sapGet5GHzChannelList(ptSapContext sapContext) if( regChannels[i].enabled == NV_CHANNEL_ENABLE || regChannels[i].enabled == NV_CHANNEL_DFS ) { - sapContext->SapAllChnlList.channelList[count] = + sapContext->SapAllChnlList.channelList[count].channel = rfChannels[i].channelNum; VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW, "%s[%d] CHANNEL = %d",__func__, __LINE__, - sapContext->SapAllChnlList.channelList[count]); + sapContext->SapAllChnlList.channelList[count].channel); + sapContext->SapAllChnlList.channelList[count].valid = VOS_TRUE; count++; } } @@ -3628,7 +3839,14 @@ v_U8_t sapIndicateRadar(ptSapContext sapContext, tSirSmeDfsEventInd *dfs_event) */ target_channel = sapRandomChannelSel(sapContext); - + if (0 == target_channel) + { + sapSignalHDDevent(sapContext, NULL, eSAP_DFS_NO_AVAILABLE_CHANNEL, + (v_PVOID_t) eSAP_STATUS_SUCCESS); + } + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_WARN, + FL("sapdfs: New selected target channel is [%d]"), + target_channel); return target_channel; } diff --git a/CORE/SAP/src/sapInternal.h b/CORE/SAP/src/sapInternal.h index 689f02e282b8..b6458774a8b5 100644 --- a/CORE/SAP/src/sapInternal.h +++ b/CORE/SAP/src/sapInternal.h @@ -232,7 +232,7 @@ typedef struct sSapContext { * any random channel[5Ghz-(NON-DFS/DFS)],if SAP is operating * on a DFS channel and a RADAR is detected on the channel. */ - tSapChannelListInfo SapAllChnlList; + tAll5GChannelList SapAllChnlList; tANI_BOOLEAN allBandScanned; @@ -882,7 +882,9 @@ v_BOOL_t sapAcsChannelCheck(ptSapContext sapContext, v_U8_t channelNumber); * FALSE: good to be used */ v_BOOL_t -sapChannelMatrixCheck(ptSapContext sapContext, v_U8_t target_channel); +sapChannelMatrixCheck(ptSapContext sapContext, + ePhyChanBondState cbMode, + v_U8_t target_channel); #ifdef __cplusplus } #endif diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.c b/CORE/SERVICES/HIF/PCIe/if_pci.c index 55a24e8d1d8e..129240688bf5 100644 --- a/CORE/SERVICES/HIF/PCIe/if_pci.c +++ b/CORE/SERVICES/HIF/PCIe/if_pci.c @@ -1664,8 +1664,6 @@ void hif_pci_shutdown(struct pci_dev *pdev) if (!sc) return; - sc->recovery = true; - if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HIF, NULL)) { printk("Load/unload in progress, ignore SSR shutdown\n"); return; diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c index 991ed1828502..b8e5432efc35 100644 --- a/CORE/SME/src/csr/csrApiRoam.c +++ b/CORE/SME/src/csr/csrApiRoam.c @@ -18201,6 +18201,7 @@ csrRoamChannelChangeReq( tpAniSirGlobal pMac, tCsrBssid bssid, { eHalStatus status = eHAL_STATUS_SUCCESS; tSirChanChangeRequest *pMsg; + tANI_U32 vhtChannelWidth; pMsg = vos_mem_malloc( sizeof(tSirChanChangeRequest) ); if (!pMsg) @@ -18210,6 +18211,13 @@ csrRoamChannelChangeReq( tpAniSirGlobal pMac, tCsrBssid bssid, vos_mem_set((void *)pMsg, sizeof( tSirChanChangeRequest ), 0); + /* + * We are getting channel width from sapDfsInfor structure + * because we've implemented channel width fallback mechanism for DFS + * which will result in channel width changing dynamically. + */ + vhtChannelWidth = pMac->sap.SapDfsInfo.new_chanWidth; + #ifdef WLAN_FEATURE_11AC // cbMode = 1 in cfg.ini is mapped to PHY_DOUBLE_CHANNEL_HIGH_PRIMARY = 3 // in function csrConvertCBIniValueToPhyCBState() @@ -18221,7 +18229,10 @@ csrRoamChannelChangeReq( tpAniSirGlobal pMac, tCsrBssid bssid, } else { - ccmCfgSetInt(pMac, WNI_CFG_VHT_CHANNEL_WIDTH, pMac->roam.configParam.nVhtChannelWidth, NULL, eANI_BOOLEAN_FALSE); + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_MED, + FL("sapdfs: channel width is [%d]"), vhtChannelWidth); + ccmCfgSetInt(pMac, WNI_CFG_VHT_CHANNEL_WIDTH, + vhtChannelWidth, NULL, eANI_BOOLEAN_FALSE); } } #endif diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c index c0b042256652..f87e25d07a49 100644 --- a/CORE/SME/src/sme_common/sme_Api.c +++ b/CORE/SME/src/sme_common/sme_Api.c @@ -12606,14 +12606,23 @@ eHalStatus sme_RoamChannelChangeReq( tHalHandle hHal, tCsrBssid bssid, { eHalStatus status = eHAL_STATUS_FAILURE; tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); + tANI_U32 cbMode; + + /* + * We are getting channel bonding mode from sapDfsInfor structure + * because we've implemented channel width fallback mechanism for DFS + * which will result in channel width changing dynamically. + */ + cbMode = pMac->sap.SapDfsInfo.new_cbMode; status = sme_AcquireGlobalLock( &pMac->sme ); if ( HAL_STATUS_SUCCESS( status ) ) { sme_SelectCBMode(hHal, phyMode, targetChannel); - status = csrRoamChannelChangeReq( pMac, bssid, targetChannel, - pMac->roam.configParam.channelBondingMode5GHz ); - + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_MED, + FL("sapdfs: channel bonding mode is [%d]"), cbMode); + status = csrRoamChannelChangeReq(pMac, bssid, targetChannel, + cbMode); sme_ReleaseGlobalLock( &pMac->sme ); } return (status); |
