summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2014-09-06 00:59:06 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2014-09-06 00:59:06 -0700
commit95b5f88f4905df0b6ea417a04feb4a623eb68cc4 (patch)
tree358f28202e0b015ab28790f3f171b6892ea142ce
parent3ef450c9991e7fbae1a7e3986d3e0bc2848034dc (diff)
parent4c9215995004dbd49fad19079b210381b5f67cd2 (diff)
Merge "Release 1.0.0.184A QCACLD WLAN Drive"
-rw-r--r--CORE/CLD_TXRX/HTT/htt_rx.c6
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx.c3
-rw-r--r--CORE/HDD/src/wlan_hdd_ipa.c54
-rw-r--r--CORE/MAC/inc/qwlan_version.h2
-rw-r--r--CORE/MAC/src/pe/lim/limAssocUtils.c3
-rw-r--r--CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c19
-rw-r--r--CORE/MAC/src/pe/lim/limSendManagementFrames.c3
-rw-r--r--CORE/MAC/src/pe/lim/limUtils.c3
-rw-r--r--CORE/MAC/src/pe/sch/schBeaconProcess.c6
-rw-r--r--CORE/SAP/inc/sapApi.h8
-rw-r--r--CORE/SAP/src/sapChSelect.h29
-rw-r--r--CORE/SAP/src/sapFsm.c654
-rw-r--r--CORE/SAP/src/sapInternal.h6
-rw-r--r--CORE/SERVICES/HIF/PCIe/if_pci.c2
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c13
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c15
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);