summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo Chang <schang@qca.qualcomm.com>2014-02-18 15:30:19 -0800
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-02-21 17:36:09 -0800
commit87a632a54e05e49b33c581d81409137be7ff5b54 (patch)
tree5fa7cf765d5e6bef2d50d01cb1fec068f12b71b0
parent455a1583e7ee80a0d3741bd3ef31195f1359afe1 (diff)
wlan: rome mdm ipa, IPA disabled, RX system crash fix
If disable IPA, WLAN RX crash happen with throughput test pumping more than 40MBPS. To fix CPU migration issue with multicore system, TL SHIM RX thread was introduced, and linked multiple frames will be pushed into HDD registered callback function. legacy HDD RX callback function did not have linked SKB handle capability, but IPA HDD has it. As a result, if AMPDU enabled, more than 40mbps tPut, multiple linked frames will push to HDD, and legacy HDD function will handle only first frame of the link. Before call legacy RX frame handler, unlink capability is needed between TL shim and HDD legacy API. Change-Id: I343581a0005b7a4c55351090461bd7618d7615a9 CRs-fixed: 605512
-rw-r--r--CORE/HDD/inc/wlan_hdd_softap_tx_rx.h16
-rw-r--r--CORE/HDD/inc/wlan_hdd_tx_rx.h17
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c19
-rw-r--r--CORE/HDD/src/wlan_hdd_softap_tx_rx.c45
-rw-r--r--CORE/HDD/src/wlan_hdd_tx_rx.c37
5 files changed, 125 insertions, 9 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_softap_tx_rx.h b/CORE/HDD/inc/wlan_hdd_softap_tx_rx.h
index 5c8a8d7b1774..cdce12535c64 100644
--- a/CORE/HDD/inc/wlan_hdd_softap_tx_rx.h
+++ b/CORE/HDD/inc/wlan_hdd_softap_tx_rx.h
@@ -235,6 +235,22 @@ extern VOS_STATUS hdd_softap_rx_packet_cbk( v_VOID_t *vosContext,
extern VOS_STATUS hdd_softap_rx_packet_cbk(v_VOID_t *vosContext,
adf_nbuf_t rxBufChain,
v_U8_t staId);
+#ifdef IPA_OFFLOAD
+/**============================================================================
+ @brief hdd_softap_rx_mul_packet_cbk() - Receive callback registered with TL.
+ IPA integrated platform, TL Shim will give multiple RX frames with NETBUF
+ link. Linked frames should be un-link and send to NETDEV.
+
+ @param vosContext : [in] pointer to VOS context
+ @param rx_buf_list : [in] pointer to rx adf_nbuf linked list
+ @param staId : [in] Station Id (Adress 1 Index)
+
+ @return : VOS_STATUS_E_FAILURE if any errors encountered,
+ : VOS_STATUS_SUCCESS otherwise
+ ===========================================================================*/
+VOS_STATUS hdd_softap_rx_mul_packet_cbk(v_VOID_t *vosContext,
+ adf_nbuf_t rx_buf_list, v_U8_t staId);
+#endif /* IPA_OFFLOAD */
#endif
/**============================================================================
diff --git a/CORE/HDD/inc/wlan_hdd_tx_rx.h b/CORE/HDD/inc/wlan_hdd_tx_rx.h
index ecbcee68ffbd..b500edd258b1 100644
--- a/CORE/HDD/inc/wlan_hdd_tx_rx.h
+++ b/CORE/HDD/inc/wlan_hdd_tx_rx.h
@@ -230,6 +230,23 @@ extern VOS_STATUS hdd_rx_packet_cbk( v_VOID_t *vosContext,
===========================================================================*/
extern VOS_STATUS hdd_rx_packet_cbk(v_VOID_t *vosContext, adf_nbuf_t rxBufChain,
v_U8_t staId);
+
+#ifdef IPA_OFFLOAD
+/**============================================================================
+ @brief hdd_rx_mul_packet_cbk() - Receive callback registered with TL.
+ IPA integrated platform, TL Shim will give multiple RX frames with NETBUF
+ link. Linked frames should be un-link and send to NETDEV.
+
+ @param vosContext : [in] pointer to VOS context
+ @param rx_buf_list : [in] pointer to rx adf_nbuf linked list
+ @param staId : [in] Station Id (Adress 1 Index)
+
+ @return : VOS_STATUS_E_FAILURE if any errors encountered,
+ : VOS_STATUS_SUCCESS otherwise
+ ===========================================================================*/
+VOS_STATUS hdd_rx_mul_packet_cbk(v_VOID_t *vosContext,
+ adf_nbuf_t rx_buf_list, v_U8_t staId);
+#endif /* IPA_OFFLOAD */
#endif
/**============================================================================
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index e9f9757b17e6..aaa68744e1d0 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -1089,14 +1089,18 @@ static VOS_STATUS hdd_roamRegisterSTA( hdd_adapter_t *pAdapter,
hdd_tx_fetch_packet_cbk, &staDesc,
pBssDesc->rssi );
} else {
-#endif
+ vosStatus = WLANTL_RegisterSTAClient( pHddCtx->pvosContext,
+ hdd_rx_mul_packet_cbk,
+ hdd_tx_complete_cbk,
+ hdd_tx_fetch_packet_cbk, &staDesc,
+ pBssDesc->rssi );
+ }
+#else
vosStatus = WLANTL_RegisterSTAClient( pHddCtx->pvosContext,
hdd_rx_packet_cbk,
hdd_tx_complete_cbk,
hdd_tx_fetch_packet_cbk, &staDesc,
pBssDesc->rssi );
-#ifdef IPA_OFFLOAD
- }
#endif
if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
@@ -2218,13 +2222,16 @@ VOS_STATUS hdd_roamRegisterTDLSSTA( hdd_adapter_t *pAdapter,
hdd_tx_complete_cbk,
hdd_tx_fetch_packet_cbk, &staDesc, 0 );
} else {
-#endif
+ vosStatus = WLANTL_RegisterSTAClient( pHddCtx->pvosContext,
+ hdd_rx_mul_packet_cbk,
+ hdd_tx_complete_cbk,
+ hdd_tx_fetch_packet_cbk, &staDesc, 0 );
+ }
+#else
vosStatus = WLANTL_RegisterSTAClient( pVosContext,
hdd_rx_packet_cbk,
hdd_tx_complete_cbk,
hdd_tx_fetch_packet_cbk, &staDesc, 0 );
-#ifdef IPA_OFFLOAD
- }
#endif
if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
index e43da5bebedf..64fff5970a58 100644
--- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
@@ -1658,6 +1658,42 @@ VOS_STATUS hdd_softap_rx_packet_cbk(v_VOID_t *vosContext,
return VOS_STATUS_SUCCESS;
}
+
+#ifdef IPA_OFFLOAD
+/**============================================================================
+ @brief hdd_softap_rx_mul_packet_cbk() - Receive callback registered with TL.
+ IPA integrated platform, TL Shim will give multiple RX frames with NETBUF
+ link. Linked frames should be un-link and send to NETDEV.
+
+ @param vosContext : [in] pointer to VOS context
+ @param rx_buf_list : [in] pointer to rx adf_nbuf linked list
+ @param staId : [in] Station Id (Adress 1 Index)
+
+ @return : VOS_STATUS_E_FAILURE if any errors encountered,
+ : VOS_STATUS_SUCCESS otherwise
+ ===========================================================================*/
+VOS_STATUS hdd_softap_rx_mul_packet_cbk(v_VOID_t *vosContext,
+ adf_nbuf_t rx_buf_list, v_U8_t staId)
+{
+ adf_nbuf_t buf, next_buf;
+ VOS_STATUS status;
+
+ buf = rx_buf_list;
+ while(buf)
+ {
+ next_buf = adf_nbuf_queue_next(buf);
+ status = hdd_softap_rx_packet_cbk(vosContext, buf, staId);
+ if(!VOS_IS_STATUS_SUCCESS(status))
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: RX fail, satus %d", __func__, status);
+ return status;
+ }
+ buf = next_buf;
+ }
+ return VOS_STATUS_SUCCESS;
+}
+#endif /* IPA_OFFLOAD */
#endif
VOS_STATUS hdd_softap_DeregisterSTA( hdd_adapter_t *pAdapter, tANI_U8 staId )
@@ -1809,13 +1845,16 @@ VOS_STATUS hdd_softap_RegisterSTA( hdd_adapter_t *pAdapter,
hdd_softap_tx_complete_cbk,
hdd_softap_tx_fetch_packet_cbk, &staDesc, 0 );
} else {
-#endif
+ vosStatus = WLANTL_RegisterSTAClient( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
+ hdd_softap_rx_mul_packet_cbk,
+ hdd_softap_tx_complete_cbk,
+ hdd_softap_tx_fetch_packet_cbk, &staDesc, 0 );
+ }
+#else
vosStatus = WLANTL_RegisterSTAClient( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
hdd_softap_rx_packet_cbk,
hdd_softap_tx_complete_cbk,
hdd_softap_tx_fetch_packet_cbk, &staDesc, 0 );
-#ifdef IPA_OFFLOAD
- }
#endif
if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
{
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index ce7e64941b66..ab764e816143 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -2055,4 +2055,41 @@ void hdd_tx_rx_pkt_cnt_stat_timer_handler( void *phddctx)
{
}
+
+#ifdef IPA_OFFLOAD
+/**============================================================================
+ @brief hdd_rx_mul_packet_cbk() - Receive callback registered with TL.
+ IPA integrated platform, TL Shim will give multiple RX frames with NETBUF
+ link. Linked frames should be un-link and send to NETDEV.
+
+ @param vosContext : [in] pointer to VOS context
+ @param rx_buf_list : [in] pointer to rx adf_nbuf linked list
+ @param staId : [in] Station Id (Adress 1 Index)
+
+ @return : VOS_STATUS_E_FAILURE if any errors encountered,
+ : VOS_STATUS_SUCCESS otherwise
+ ===========================================================================*/
+VOS_STATUS hdd_rx_mul_packet_cbk(v_VOID_t *vosContext,
+ adf_nbuf_t rx_buf_list, v_U8_t staId)
+{
+ adf_nbuf_t buf, next_buf;
+ VOS_STATUS status;
+
+ buf = rx_buf_list;
+ while(buf)
+ {
+ next_buf = adf_nbuf_queue_next(buf);
+ status = hdd_rx_packet_cbk(vosContext, buf, staId);
+ if(!VOS_IS_STATUS_SUCCESS(status))
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: RX fail, status %d", __func__, status);
+ return status;
+ }
+ buf = next_buf;
+ }
+ return VOS_STATUS_SUCCESS;
+}
+#endif /* IPA_OFFLOAD */
+
#endif /* QCA_WIFI_2_0 */